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

https://gitlab.com/jonnialva90/iridium-browser · Java · 245 lines · 186 code · 29 blank · 30 comment · 23 complexity · 02eade64820baafdca850849d70a990e MD5 · raw file

  1. // Copyright 2015 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. package org.chromium.content.browser.webcontents;
  5. import org.chromium.base.ObserverList;
  6. import org.chromium.base.ObserverList.RewindableIterator;
  7. import org.chromium.base.ThreadUtils;
  8. import org.chromium.base.annotations.CalledByNative;
  9. import org.chromium.base.annotations.JNINamespace;
  10. import org.chromium.content_public.browser.WebContentsObserver;
  11. /**
  12. * Serves as a compound observer proxy for dispatching WebContentsObserver callbacks,
  13. * avoiding redundant JNI-related work when there are multiple Java-based observers.
  14. */
  15. @JNINamespace("content")
  16. class WebContentsObserverProxy extends WebContentsObserver {
  17. private long mNativeWebContentsObserverProxy;
  18. private final ObserverList<WebContentsObserver> mObservers;
  19. private final RewindableIterator<WebContentsObserver> mObserversIterator;
  20. /**
  21. * Constructs a new WebContentsObserverProxy for a given WebContents
  22. * instance. A native WebContentsObserver instance will be created, which
  23. * will observe the native counterpart to the provided WebContents.
  24. *
  25. * @param webContents The WebContents instance to observe.
  26. */
  27. public WebContentsObserverProxy(WebContentsImpl webContents) {
  28. ThreadUtils.assertOnUiThread();
  29. mNativeWebContentsObserverProxy = nativeInit(webContents);
  30. mObservers = new ObserverList<WebContentsObserver>();
  31. mObserversIterator = mObservers.rewindableIterator();
  32. }
  33. /**
  34. * Add an observer to the list of proxied observers.
  35. * @param observer The WebContentsObserver instance to add.
  36. */
  37. void addObserver(WebContentsObserver observer) {
  38. assert mNativeWebContentsObserverProxy != 0;
  39. mObservers.addObserver(observer);
  40. }
  41. /**
  42. * Remove an observer from the list of proxied observers.
  43. * @param observer The WebContentsObserver instance to remove.
  44. */
  45. void removeObserver(WebContentsObserver observer) {
  46. mObservers.removeObserver(observer);
  47. }
  48. /**
  49. * @return Whether there are any active, proxied observers.
  50. */
  51. boolean hasObservers() {
  52. return !mObservers.isEmpty();
  53. }
  54. @Override
  55. @CalledByNative
  56. public void renderViewReady() {
  57. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  58. mObserversIterator.next().renderViewReady();
  59. }
  60. }
  61. @Override
  62. @CalledByNative
  63. public void renderProcessGone(boolean wasOomProtected) {
  64. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  65. mObserversIterator.next().renderProcessGone(wasOomProtected);
  66. }
  67. }
  68. @Override
  69. @CalledByNative
  70. public void didStartLoading(String url) {
  71. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  72. mObserversIterator.next().didStartLoading(url);
  73. }
  74. }
  75. @Override
  76. @CalledByNative
  77. public void didStopLoading(String url) {
  78. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  79. mObserversIterator.next().didStopLoading(url);
  80. }
  81. }
  82. @Override
  83. @CalledByNative
  84. public void didFailLoad(boolean isProvisionalLoad, boolean isMainFrame, int errorCode,
  85. String description, String failingUrl, boolean wasIgnoredByHandler) {
  86. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  87. mObserversIterator.next().didFailLoad(isProvisionalLoad, isMainFrame, errorCode,
  88. description, failingUrl, wasIgnoredByHandler);
  89. }
  90. }
  91. @Override
  92. @CalledByNative
  93. public void didNavigateMainFrame(String url, String baseUrl,
  94. boolean isNavigationToDifferentPage, boolean isFragmentNavigation, int statusCode) {
  95. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  96. mObserversIterator.next().didNavigateMainFrame(
  97. url, baseUrl, isNavigationToDifferentPage, isFragmentNavigation, statusCode);
  98. }
  99. }
  100. @Override
  101. @CalledByNative
  102. public void didFirstVisuallyNonEmptyPaint() {
  103. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  104. mObserversIterator.next().didFirstVisuallyNonEmptyPaint();
  105. }
  106. }
  107. @Override
  108. @CalledByNative
  109. public void didNavigateAnyFrame(String url, String baseUrl, boolean isReload) {
  110. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  111. mObserversIterator.next().didNavigateAnyFrame(url, baseUrl, isReload);
  112. }
  113. }
  114. @Override
  115. @CalledByNative
  116. public void documentAvailableInMainFrame() {
  117. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  118. mObserversIterator.next().documentAvailableInMainFrame();
  119. }
  120. }
  121. @Override
  122. @CalledByNative
  123. public void didStartProvisionalLoadForFrame(long frameId, long parentFrameId,
  124. boolean isMainFrame, String validatedUrl, boolean isErrorPage, boolean isIframeSrcdoc) {
  125. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  126. mObserversIterator.next().didStartProvisionalLoadForFrame(
  127. frameId, parentFrameId, isMainFrame, validatedUrl, isErrorPage, isIframeSrcdoc);
  128. }
  129. }
  130. @Override
  131. @CalledByNative
  132. public void didCommitProvisionalLoadForFrame(
  133. long frameId, boolean isMainFrame, String url, int transitionType) {
  134. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  135. mObserversIterator.next().didCommitProvisionalLoadForFrame(
  136. frameId, isMainFrame, url, transitionType);
  137. }
  138. }
  139. @Override
  140. @CalledByNative
  141. public void didFinishLoad(long frameId, String validatedUrl, boolean isMainFrame) {
  142. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  143. mObserversIterator.next().didFinishLoad(frameId, validatedUrl, isMainFrame);
  144. }
  145. }
  146. @Override
  147. @CalledByNative
  148. public void documentLoadedInFrame(long frameId, boolean isMainFrame) {
  149. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  150. mObserversIterator.next().documentLoadedInFrame(frameId, isMainFrame);
  151. }
  152. }
  153. @Override
  154. @CalledByNative
  155. public void navigationEntryCommitted() {
  156. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  157. mObserversIterator.next().navigationEntryCommitted();
  158. }
  159. }
  160. @Override
  161. @CalledByNative
  162. public void didAttachInterstitialPage() {
  163. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  164. mObserversIterator.next().didAttachInterstitialPage();
  165. }
  166. }
  167. @Override
  168. @CalledByNative
  169. public void didDetachInterstitialPage() {
  170. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  171. mObserversIterator.next().didDetachInterstitialPage();
  172. }
  173. }
  174. @Override
  175. @CalledByNative
  176. public void didChangeThemeColor(int color) {
  177. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  178. mObserversIterator.next().didChangeThemeColor(color);
  179. }
  180. }
  181. @Override
  182. @CalledByNative
  183. public void didStartNavigationToPendingEntry(String url) {
  184. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  185. mObserversIterator.next().didStartNavigationToPendingEntry(url);
  186. }
  187. }
  188. @Override
  189. @CalledByNative
  190. public void mediaSessionStateChanged(boolean isControllable, boolean isSuspended) {
  191. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  192. mObserversIterator.next().mediaSessionStateChanged(isControllable, isSuspended);
  193. }
  194. }
  195. @Override
  196. @CalledByNative
  197. public void destroy() {
  198. // Super destruction semantics (removing the observer from the
  199. // Java-based WebContents) are quite different, so we explicitly avoid
  200. // calling it here.
  201. ThreadUtils.assertOnUiThread();
  202. for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
  203. mObserversIterator.next().destroy();
  204. }
  205. // All observer destroy() implementations should result in their removal
  206. // from the proxy.
  207. assert mObservers.isEmpty();
  208. mObservers.clear();
  209. if (mNativeWebContentsObserverProxy != 0) {
  210. nativeDestroy(mNativeWebContentsObserverProxy);
  211. mNativeWebContentsObserverProxy = 0;
  212. }
  213. }
  214. private native long nativeInit(WebContentsImpl webContents);
  215. private native void nativeDestroy(long nativeWebContentsObserverProxy);
  216. }