Bug 1461738 - 3. Add test for clearing navigation delegate on load; r?esawin draft
authorJim Chen <nchen@mozilla.com>
Tue, 15 May 2018 13:15:11 -0400
changeset 795337 3de81d04f3ac49194e5f74a9fd6271dd89143697
parent 795336 ce723f61931ce212d2bd83a70efd0c82a86c356c
child 795343 bbe1086b548fa4330cd745d194685585b21de5cc
push id109938
push userbmo:nchen@mozilla.com
push dateTue, 15 May 2018 17:16:21 +0000
reviewersesawin
bugs1461738
milestone62.0a1
Bug 1461738 - 3. Add test for clearing navigation delegate on load; r?esawin Add a test where we clear the navigation delegate right after starting a load. This test exposes the race between Gecko thread and UI thread when clearing a delegate. MozReview-Commit-ID: IQrGcuwoDEk
mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/NavigationDelegateTest.kt
--- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/NavigationDelegateTest.kt
+++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/NavigationDelegateTest.kt
@@ -89,16 +89,39 @@ class NavigationDelegateTest : BaseSessi
         // Test that when navigation delegate is disabled, we can still perform loads.
         sessionRule.session.loadTestPath(HELLO_HTML_PATH)
         sessionRule.session.waitForPageStop()
 
         sessionRule.session.reload()
         sessionRule.session.waitForPageStop()
     }
 
+    @NullDelegate(GeckoSession.NavigationDelegate::class)
+    @Test fun load_canUnsetNavigationDelegate() {
+        // Test that if we unset the navigation delegate during a load, the load still proceeds.
+        var onLocationCount = 0
+        sessionRule.session.navigationDelegate = object : Callbacks.NavigationDelegate {
+            override fun onLocationChange(session: GeckoSession, url: String) {
+                onLocationCount++
+            }
+        }
+        sessionRule.session.loadTestPath(HELLO_HTML_PATH)
+        sessionRule.session.waitForPageStop()
+
+        assertThat("Should get callback for first load",
+                   onLocationCount, equalTo(1))
+
+        sessionRule.session.reload()
+        sessionRule.session.navigationDelegate = null
+        sessionRule.session.waitForPageStop()
+
+        assertThat("Should not get callback for second load",
+                   onLocationCount, equalTo(1))
+    }
+
     @Test fun loadString() {
         val dataString = "<html><head><title>TheTitle</title></head><body>TheBody</body></html>"
         val mimeType = "text/html"
         sessionRule.session.loadString(dataString, mimeType)
         sessionRule.waitForPageStop();
 
         sessionRule.forCallbacksDuringWait(object : Callbacks.NavigationDelegate, Callbacks.ProgressDelegate, Callbacks.ContentDelegate {
             @AssertCalled