Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1447)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java

Issue 786933005: [Android] Add proxy for Java-based WebContentsObservers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix build Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
+}

Powered by Google App Engine
This is Rietveld 408576698