Index: content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..43c8ae5646f309a0a3cd3fae5e394d681a4b355a |
--- /dev/null |
+++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java |
@@ -0,0 +1,220 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.content.browser.webcontents; |
+ |
+import org.chromium.base.CalledByNative; |
+import org.chromium.base.JNINamespace; |
+import org.chromium.base.RewindableIterator; |
+import org.chromium.base.ThreadUtils; |
+import org.chromium.base.WeakObserverList; |
+import org.chromium.content_public.browser.WebContentsObserver; |
+ |
+/** |
+ * Serves as a compound observer proxy for dispatching WebContentsObserver callbacks, |
+ * avoiding redundant JNI-related work when there are multiple Java-based observers. |
+ */ |
+@JNINamespace("content") |
+class WebContentsObserverProxy extends WebContentsObserver { |
+ private long mNativeWebContentsObserverAndroid; |
+ private final WeakObserverList<WebContentsObserver> mObservers; |
Ted C
2015/02/18 22:54:36
I don't really like the weak ref-ness of this. It
jdduke (slow)
2015/02/24 20:55:49
Done.
|
+ private final RewindableIterator<WebContentsObserver> mObserversIterator; |
+ |
+ public WebContentsObserverProxy(WebContentsImpl webContents) { |
+ ThreadUtils.assertOnUiThread(); |
+ mNativeWebContentsObserverAndroid = nativeInit(webContents); |
+ mObservers = new WeakObserverList<WebContentsObserver>(); |
+ mObserversIterator = mObservers.rewindableIterator(); |
+ } |
+ |
+ void addObserver(WebContentsObserver observer) { |
Ted C
2015/02/18 22:54:36
javadocs :-)
jdduke (slow)
2015/02/24 20:55:49
Done.
|
+ assert mNativeWebContentsObserverAndroid != 0; |
+ mObservers.addObserver(observer); |
+ } |
+ |
+ void removeObserver(WebContentsObserver observer) { |
+ mObservers.removeObserver(observer); |
+ } |
+ |
+ boolean hasObservers() { |
+ return !mObservers.isEmpty(); |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void renderViewReady() { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().renderViewReady(); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void renderProcessGone(boolean wasOomProtected) { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().renderProcessGone(wasOomProtected); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void didStartLoading(String url) { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().didStartLoading(url); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void didStopLoading(String url) { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().didStopLoading(url); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void didFailLoad(boolean isProvisionalLoad, |
+ boolean isMainFrame, int errorCode, String description, String failingUrl) { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().didFailLoad( |
+ isProvisionalLoad, isMainFrame, errorCode, description, failingUrl); |
+ } |
+ } |
+ |
+ @Override |
+ public void didNavigateMainFrame(String url, String baseUrl, |
+ boolean isNavigationToDifferentPage, boolean isFragmentNavigation) { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().didNavigateMainFrame( |
+ url, baseUrl, isNavigationToDifferentPage, isFragmentNavigation); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void didNavigateMainFrame(String url, String baseUrl, |
+ boolean isNavigationToDifferentPage, boolean isFragmentNavigation, int statusCode) { |
+ didNavigateMainFrame(url, baseUrl, isNavigationToDifferentPage, isFragmentNavigation); |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void didFirstVisuallyNonEmptyPaint() { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().didFirstVisuallyNonEmptyPaint(); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void didNavigateAnyFrame(String url, String baseUrl, boolean isReload) { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().didNavigateAnyFrame(url, baseUrl, isReload); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void documentAvailableInMainFrame() { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().documentAvailableInMainFrame(); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void didStartProvisionalLoadForFrame( |
+ long frameId, |
+ long parentFrameId, |
+ boolean isMainFrame, |
+ String validatedUrl, |
+ boolean isErrorPage, |
+ boolean isIframeSrcdoc) { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().didStartProvisionalLoadForFrame( |
+ frameId, parentFrameId, isMainFrame, validatedUrl, isErrorPage, isIframeSrcdoc); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void didCommitProvisionalLoadForFrame( |
+ long frameId, boolean isMainFrame, String url, int transitionType) { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().didCommitProvisionalLoadForFrame( |
+ frameId, isMainFrame, url, transitionType); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void didFinishLoad(long frameId, String validatedUrl, boolean isMainFrame) { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().didFinishLoad(frameId, validatedUrl, isMainFrame); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void documentLoadedInFrame(long frameId) { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().documentLoadedInFrame(frameId); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void navigationEntryCommitted() { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().navigationEntryCommitted(); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void didAttachInterstitialPage() { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().didAttachInterstitialPage(); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void didDetachInterstitialPage() { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().didDetachInterstitialPage(); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void didChangeThemeColor(int color) { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().didChangeThemeColor(color); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void didStartNavigationToPendingEntry(String url) { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().didStartNavigationToPendingEntry(url); |
+ } |
+ } |
+ |
+ @Override |
+ @CalledByNative |
+ public void detachFromWebContents() { |
Ted C
2015/02/18 22:54:37
I would just call this destroy.
jdduke (slow)
2015/02/24 20:55:49
Done.
|
+ ThreadUtils.assertOnUiThread(); |
+ mObservers.clear(); |
+ if (mNativeWebContentsObserverAndroid != 0) { |
+ nativeDestroy(mNativeWebContentsObserverAndroid); |
+ mNativeWebContentsObserverAndroid = 0; |
+ } |
+ } |
+ |
+ private native long nativeInit(WebContentsImpl webContents); |
+ private native void nativeDestroy(long nativeWebContentsObserverAndroid); |
+} |