Bug 1319485 - Pre: add domain extraction and tests to BrowserProvider
MozReview-Commit-ID: EM2ZapLXsVK
--- 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));
+ }
+}