Bug 1319485 - Pre: add domain extraction and tests to BrowserProvider draft
authorAndrzej Hunt <ahunt@mozilla.com>
Tue, 17 Jan 2017 20:24:21 +0100
changeset 462621 222abdd3e47e8d6fae8de860ca03795542209faf
parent 462620 6019000bd13900c6f7d1224de84768606cb544cc
child 462622 6aa72f8793f58c5803fc66ce6a136b37a6e2364d
push id41827
push userahunt@mozilla.com
push dateTue, 17 Jan 2017 20:52:39 +0000
bugs1319485
milestone53.0a1
Bug 1319485 - Pre: add domain extraction and tests to BrowserProvider MozReview-Commit-ID: EM2ZapLXsVK
mobile/android/base/java/org/mozilla/gecko/db/BrowserProvider.java
mobile/android/tests/background/junit4/src/org/mozilla/gecko/db/TestDomainExtraction.java
--- a/mobile/android/base/java/org/mozilla/gecko/db/BrowserProvider.java
+++ b/mobile/android/base/java/org/mozilla/gecko/db/BrowserProvider.java
@@ -1,16 +1,18 @@
 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.gecko.db;
 
 import java.lang.ref.WeakReference;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import org.mozilla.gecko.AboutPages;
 import org.mozilla.gecko.GeckoProfile;
@@ -27,16 +29,17 @@ import org.mozilla.gecko.db.BrowserContr
 import org.mozilla.gecko.db.BrowserContract.Tabs;
 import org.mozilla.gecko.db.BrowserContract.Thumbnails;
 import org.mozilla.gecko.db.BrowserContract.TopSites;
 import org.mozilla.gecko.db.BrowserContract.UrlAnnotations;
 import org.mozilla.gecko.db.BrowserContract.PageMetadata;
 import org.mozilla.gecko.db.DBUtils.UpdateOperation;
 import org.mozilla.gecko.icons.IconsHelper;
 import org.mozilla.gecko.sync.Utils;
+import org.mozilla.gecko.util.StringUtils;
 import org.mozilla.gecko.util.ThreadUtils;
 
 import android.content.BroadcastReceiver;
 import android.content.ContentProviderOperation;
 import android.content.ContentProviderResult;
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
@@ -48,16 +51,17 @@ import android.database.Cursor;
 import android.database.DatabaseUtils;
 import android.database.MatrixCursor;
 import android.database.MergeCursor;
 import android.database.SQLException;
 import android.database.sqlite.SQLiteCursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteQueryBuilder;
 import android.net.Uri;
+import android.support.annotation.NonNull;
 import android.support.v4.content.LocalBroadcastManager;
 import android.text.TextUtils;
 import android.util.Log;
 
 public class BrowserProvider extends SharedBrowserDatabaseProvider {
     public static final String ACTION_SHRINK_MEMORY = "org.mozilla.gecko.db.intent.action.SHRINK_MEMORY";
 
     private static final String LOGTAG = "GeckoBrowserProvider";
@@ -1789,16 +1793,38 @@ public class BrowserProvider extends Sha
         // trying to insert history record visits coming in from sync which are already present locally
         // as a result of previous sync operations.
         // An alternative to doing this is to filter out already present records when we're doing history inserts
         // from Sync, which is a costly operation to do en masse.
         return db.insertWithOnConflict(
                 TABLE_VISITS, null, values, SQLiteDatabase.CONFLICT_IGNORE);
     }
 
+    /**
+     * Obtain the domain for a given URL.
+     *
+     * A URL which is empty (or null), is assumed to have an empty domain.
+     * An unparseable URL will be assumed to have domain==url. about: URLs will also be handled
+     * in this way (they are not considered normal URLs).
+     */
+    /* package-private */ @NonNull static String extractDomainFromURL(final Context context, final String url) {
+        if (url == null || url.isEmpty()) {
+            return "";
+        }
+
+        final String host;
+        try {
+            host = new URL(url).getHost();
+        } catch (MalformedURLException e) {
+            return url;
+        }
+
+        return StringUtils.stripCommonSubdomains(context, host);
+    }
+
     private void updateFaviconIdsForUrl(SQLiteDatabase db, String pageUrl, Long faviconId) {
         ContentValues updateValues = new ContentValues(1);
         updateValues.put(FaviconColumns.FAVICON_ID, faviconId);
         db.update(TABLE_HISTORY,
                   updateValues,
                   History.URL + " = ?",
                   new String[] { pageUrl });
         db.update(TABLE_BOOKMARKS,
new file mode 100644
--- /dev/null
+++ b/mobile/android/tests/background/junit4/src/org/mozilla/gecko/db/TestDomainExtraction.java
@@ -0,0 +1,51 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+package org.mozilla.gecko.db;
+
+import android.content.Context;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mozilla.gecko.background.testhelpers.TestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+import static junit.framework.Assert.*;
+
+@RunWith(TestRunner.class)
+public class TestDomainExtraction {
+    final Context context = RuntimeEnvironment.application;
+
+    @Test
+    public void testDomainExtracted() {
+        assertEquals("mozilla.org",
+                BrowserProvider.extractDomainFromURL(context, "http://mozilla.org"));
+        assertEquals("mozilla.org",
+                BrowserProvider.extractDomainFromURL(context, "http://mozilla.org/a/b/c?d=e"));
+        assertEquals("mozilla.org",
+                BrowserProvider.extractDomainFromURL(context, "http://www.mozilla.org"));
+        assertEquals("mozilla.org",
+                BrowserProvider.extractDomainFromURL(context, "http://www.mozilla.org/f/g/h"));
+        assertEquals("mozilla.org",
+                BrowserProvider.extractDomainFromURL(context, "http://mobile.mozilla.org"));
+        assertEquals("mozilla.org",
+                BrowserProvider.extractDomainFromURL(context, "http://mobile.mozilla.org/i/j"));
+
+        assertEquals("something-specific.mozilla.org",
+                BrowserProvider.extractDomainFromURL(context, "http://something-specific.mozilla.org"));
+
+        assertEquals("",
+                BrowserProvider.extractDomainFromURL(context, ""));
+        assertEquals("about:home",
+                BrowserProvider.extractDomainFromURL(context, "about:home"));
+
+        assertEquals("localhost",
+                BrowserProvider.extractDomainFromURL(context, "http://localhost"));
+        assertEquals("localhost",
+                BrowserProvider.extractDomainFromURL(context, "http://localhost/asdfasdf/asdfadsf"));
+
+        assertEquals("",
+                BrowserProvider.extractDomainFromURL(context, null));
+    }
+}