Bug 1197869 - Clearing GlobalHistory cache after Sanitize:ClearHistory message; r?rnewman
MozReview-Commit-ID: 3WvrmvBwqFa
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoAppShell.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoAppShell.java
@@ -282,20 +282,16 @@ public class GeckoAppShell
public static native void dispatchMemoryPressure();
private static native void reportJavaCrash(String stackTrace);
public static void notifyUriVisited(String uri) {
sendEventToGecko(GeckoEvent.createVisitedEvent(uri));
}
- public static void clearPrivateData(String data){
- sendEventToGecko(GeckoEvent.createBroadcastEvent("Sanitize:ClearData", data));
- GlobalHistory.getInstance().clear();
- }
public static native void notifyBatteryChange(double aLevel, boolean aCharging, double aRemainingTime);
public static native void invalidateAndScheduleComposite();
public static native float computeRenderIntegrity();
public static native SurfaceBits getSurfaceBits(Surface surface);
--- a/mobile/android/base/java/org/mozilla/gecko/GlobalHistory.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GlobalHistory.java
@@ -7,48 +7,51 @@ package org.mozilla.gecko;
import java.lang.ref.SoftReference;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
import org.mozilla.gecko.db.BrowserDB;
+import org.mozilla.gecko.util.EventCallback;
+import org.mozilla.gecko.util.NativeEventListener;
+import org.mozilla.gecko.util.NativeJSObject;
import org.mozilla.gecko.util.ThreadUtils;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.os.Handler;
import android.os.SystemClock;
import android.util.Log;
-class GlobalHistory {
+public class GlobalHistory implements NativeEventListener{
private static final String LOGTAG = "GeckoGlobalHistory";
private static final String TELEMETRY_HISTOGRAM_ADD = "FENNEC_GLOBALHISTORY_ADD_MS";
private static final String TELEMETRY_HISTOGRAM_UPDATE = "FENNEC_GLOBALHISTORY_UPDATE_MS";
private static final String TELEMETRY_HISTOGRAM_BUILD_VISITED_LINK = "FENNEC_GLOBALHISTORY_VISITED_BUILD_MS";
private static final GlobalHistory sInstance = new GlobalHistory();
- static GlobalHistory getInstance() {
+ public static GlobalHistory getInstance() {
return sInstance;
}
// this is the delay between receiving a URI check request and processing it.
// this allows batching together multiple requests and processing them together,
// which is more efficient.
private static final long BATCHING_DELAY_MS = 100;
private final Handler mHandler; // a background thread on which we can process requests
// Note: These fields are accessed through the NotificationRunnable inner class.
final Queue<String> mPendingUris; // URIs that need to be checked
- SoftReference<Set<String>> mVisitedCache; // cache of the visited URI list
+ public SoftReference<Set<String>> mVisitedCache; // cache of the visited URI list
boolean mProcessing; // = false // whether or not the runnable is queued/working
private class NotifierRunnable implements Runnable {
private final ContentResolver mContentResolver;
private final BrowserDB mDB;
public NotifierRunnable(final Context context) {
mContentResolver = context.getContentResolver();
@@ -99,16 +102,18 @@ class GlobalHistory {
mProcessing = false;
}
};
private GlobalHistory() {
mHandler = ThreadUtils.getBackgroundHandler();
mPendingUris = new LinkedList<String>();
mVisitedCache = new SoftReference<Set<String>>(null);
+ EventDispatcher.getInstance().registerGeckoThreadListener((NativeEventListener)this,
+ "Sanitize:ClearHistory");
}
public void addToGeckoOnly(String uri) {
Set<String> visitedSet = mVisitedCache.get();
if (visitedSet != null) {
visitedSet.add(uri);
}
GeckoAppShell.notifyUriVisited(uri);
@@ -152,12 +157,20 @@ class GlobalHistory {
return;
}
mProcessing = true;
mHandler.postDelayed(runnable, BATCHING_DELAY_MS);
}
});
}
- public void clear(){
- mVisitedCache.clear();
+ @Override
+ public void handleMessage(String event, NativeJSObject message, EventCallback callback) {
+ clearCache();
+ }
+
+ private void clearCache(){
+ Set<String> cache = mVisitedCache.get();
+ if (cache != null) {
+ cache.clear();
+ }
}
}
--- a/mobile/android/base/java/org/mozilla/gecko/preferences/PrivateDataPreference.java
+++ b/mobile/android/base/java/org/mozilla/gecko/preferences/PrivateDataPreference.java
@@ -50,11 +50,11 @@ class PrivateDataPreference extends Mult
try {
json.put(key, true);
} catch (JSONException e) {
Log.e(LOGTAG, "JSON error", e);
}
}
// clear private data in gecko
- GeckoAppShell.clearPrivateData(json.toString());
+ GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Sanitize:ClearData", json.toString()));
}
}
--- a/mobile/android/tests/browser/robocop/robocop.ini
+++ b/mobile/android/tests/browser/robocop/robocop.ini
@@ -125,16 +125,17 @@ skip-if = android_version == "10" || and
skip-if = android_version == "10"
[src/org/mozilla/gecko/tests/testAppMenuPathways.java]
# disabled on 4.3, bug 1158005; on 2.3, bug 1235689
skip-if = android_version == "10" || android_version == "18"
[src/org/mozilla/gecko/tests/testBackButtonInEditMode.java]
[src/org/mozilla/gecko/tests/testEventDispatcher.java]
[src/org/mozilla/gecko/tests/testGeckoRequest.java]
[src/org/mozilla/gecko/tests/testInputConnection.java]
+[src/org/mozilla/gecko/tests/testClearGlobalHistory.java]
# disabled on Android 2.3; bug 1025968
skip-if = android_version == "10"
[src/org/mozilla/gecko/tests/testJavascriptBridge.java]
[src/org/mozilla/gecko/tests/testNativeCrypto.java]
[src/org/mozilla/gecko/tests/testReaderModeTitle.java]
[src/org/mozilla/gecko/tests/testSessionHistory.java]
[src/org/mozilla/gecko/tests/testStateWhileLoading.java]
new file mode 100644
--- /dev/null
+++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testClearGlobalHistory.java
@@ -0,0 +1,58 @@
+/* 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.tests;
+
+
+import org.mozilla.gecko.tests.helpers.GeckoHelper;
+import org.mozilla.gecko.tests.helpers.JavascriptBridge;
+import org.mozilla.gecko.GlobalHistory;
+import org.mozilla.gecko.tests.helpers.NavigationHelper;
+
+import java.lang.ref.SoftReference;
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertTrue;
+
+public class testClearGlobalHistory extends UITest {
+
+ private static final String NATIVE_EVENT = "Sanitize:ClearHistory";
+ private static final String TEST_JS = "testClearGlobalHistory.js";
+ private JavascriptBridge js;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ js = new JavascriptBridge(this);
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ js.disconnect();
+ super.tearDown();
+ }
+
+ public void testClearGlobalHistory() {
+ //Arrange
+ GeckoHelper.blockForReady();
+ NavigationHelper.enterAndLoadUrl(mStringHelper.getHarnessUrlForJavascript(TEST_JS));
+
+ //Add some url to cache to be sure that clear works
+ Set<String> visitedSet = new HashSet<>();
+ visitedSet.add("url");
+ GlobalHistory.getInstance().mVisitedCache = new SoftReference<>(visitedSet);
+
+ //Act
+ js.syncCall("send_message_for_response", NATIVE_EVENT, "success");
+
+ //Assert
+ Set<String> cache = getVisitedSet();
+ fAssertTrue("GlobalHistory cache should be cleared after sending Sanitize:ClearHistory message.", cache == null || cache.isEmpty());
+ }
+
+ private Set<String> getVisitedSet() {
+ return GlobalHistory.getInstance().mVisitedCache.get();
+ }
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/tests/browser/robocop/testClearGlobalHistory.js
@@ -0,0 +1,16 @@
+Components.utils.import("resource://gre/modules/Messaging.jsm");
+
+var java = new JavaBridge(this);
+
+do_register_cleanup(() => {
+ java.disconnect();
+});
+
+function send_message_for_response(type, response) {
+ Messaging.sendRequestForResult({
+ type: type,
+ response: response,
+ }).then(result => do_check_eq(result, response),
+ error => do_check_eq(error, response));
+}
+