[email protected] | b172aee | 2012-04-10 17:05:26 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #ifndef CONTENT_PUBLIC_BROWSER_WEB_CONTENTS_OBSERVER_H_ |
| 6 | #define CONTENT_PUBLIC_BROWSER_WEB_CONTENTS_OBSERVER_H_ |
| 7 | |
avi | 652869c | 2015-12-25 01:48:45 | [diff] [blame] | 8 | #include <stdint.h> |
| 9 | |
| 10 | #include "base/macros.h" |
zqzhang | 24ae1ae | 2016-09-08 11:37:10 | [diff] [blame] | 11 | #include "base/optional.h" |
[email protected] | c3c10f2 | 2013-07-25 14:21:12 | [diff] [blame] | 12 | #include "base/process/kill.h" |
| 13 | #include "base/process/process_handle.h" |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 14 | #include "content/common/content_export.h" |
[email protected] | 71fde35 | 2011-12-29 03:29:56 | [diff] [blame] | 15 | #include "content/public/browser/navigation_controller.h" |
toyoshim | 0df1d3a | 2016-09-09 09:52:48 | [diff] [blame] | 16 | #include "content/public/browser/reload_type.h" |
Francois Doray | fe4a177 | 2018-02-17 04:17:09 | [diff] [blame] | 17 | #include "content/public/browser/visibility.h" |
[email protected] | 37567b43 | 2014-02-12 01:12:22 | [diff] [blame] | 18 | #include "content/public/common/frame_navigate_params.h" |
Takuto Ikuta | aa3b796c | 2019-02-06 02:54:56 | [diff] [blame] | 19 | #include "content/public/common/resource_load_info.mojom-forward.h" |
jam | 91dd24e | 2016-08-12 17:16:42 | [diff] [blame] | 20 | #include "content/public/common/resource_type.h" |
[email protected] | c47317e | 2012-06-20 22:35:31 | [diff] [blame] | 21 | #include "ipc/ipc_listener.h" |
Ben Goodger | 9e24929e | 2017-07-21 03:13:40 | [diff] [blame] | 22 | #include "mojo/public/cpp/system/message_pipe.h" |
| 23 | #include "services/service_manager/public/cpp/bind_source_info.h" |
Blink Reformat | a30d423 | 2018-04-07 15:31:06 | [diff] [blame] | 24 | #include "third_party/blink/public/platform/web_input_event.h" |
[email protected] | e710476 | 2014-06-20 19:17:25 | [diff] [blame] | 25 | #include "third_party/skia/include/core/SkColor.h" |
Sylvain Defresne | c6ccc77d | 2014-09-19 10:19:35 | [diff] [blame] | 26 | #include "ui/base/page_transition_types.h" |
[email protected] | f47621b | 2013-01-22 20:50:33 | [diff] [blame] | 27 | #include "ui/base/window_open_disposition.h" |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 28 | |
Becca Hughes | 6fe54e43 | 2018-06-09 04:18:56 | [diff] [blame] | 29 | namespace blink { |
| 30 | namespace mojom { |
| 31 | enum class ViewportFit; |
| 32 | } // namespace mojom |
| 33 | } // namespace blink |
| 34 | |
peconn | 25795152 | 2017-06-09 18:24:59 | [diff] [blame] | 35 | namespace gfx { |
| 36 | class Size; |
| 37 | } // namespace gfx |
| 38 | |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 39 | namespace content { |
| 40 | |
[email protected] | 1ef02d24 | 2013-10-07 16:18:53 | [diff] [blame] | 41 | class NavigationEntry; |
clamy | 0e11988 | 2015-07-31 16:12:33 | [diff] [blame] | 42 | class NavigationHandle; |
[email protected] | b849847b | 2013-12-10 21:57:58 | [diff] [blame] | 43 | class RenderFrameHost; |
Avi Drissman | b3d355f | 2018-01-29 20:08:18 | [diff] [blame] | 44 | class RenderProcessHost; |
[email protected] | eaabba2 | 2012-03-07 15:02:11 | [diff] [blame] | 45 | class RenderViewHost; |
afakhry | 9824183 | 2016-03-11 19:27:47 | [diff] [blame] | 46 | class RenderWidgetHost; |
[email protected] | 26b5e32 | 2011-12-23 01:36:47 | [diff] [blame] | 47 | class WebContents; |
[email protected] | 8ff00d7 | 2012-10-23 19:12:21 | [diff] [blame] | 48 | class WebContentsImpl; |
[email protected] | 31a71eaf | 2014-03-13 01:47:36 | [diff] [blame] | 49 | struct AXEventNotificationDetails; |
dmazzoni | 2400c46 | 2016-08-23 15:07:13 | [diff] [blame] | 50 | struct AXLocationChangeNotificationDetails; |
Sam McNally | 5c087a3 | 2017-08-25 01:46:14 | [diff] [blame] | 51 | struct EntryChangedDetails; |
[email protected] | 795c2897 | 2012-12-06 06:13:39 | [diff] [blame] | 52 | struct FaviconURL; |
Jeff Fisher | 709b4c5 | 2019-07-29 20:07:34 | [diff] [blame] | 53 | struct FocusedNodeDetails; |
[email protected] | 71fde35 | 2011-12-29 03:29:56 | [diff] [blame] | 54 | struct LoadCommittedDetails; |
Mounir Lamouri | 0f5bdf5 | 2019-04-04 16:32:35 | [diff] [blame] | 55 | struct MediaPlayerId; |
Sam McNally | 5c087a3 | 2017-08-25 01:46:14 | [diff] [blame] | 56 | struct PrunedDetails; |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 57 | struct Referrer; |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 58 | |
| 59 | // An observer API implemented by classes which are interested in various page |
[email protected] | b172aee | 2012-04-10 17:05:26 | [diff] [blame] | 60 | // load events from WebContents. They also get a chance to filter IPC messages. |
[email protected] | 87eca18 | 2013-01-31 21:20:00 | [diff] [blame] | 61 | // |
[email protected] | d16609c | 2013-08-23 06:01:40 | [diff] [blame] | 62 | // Since a WebContents can be a delegate to almost arbitrarily many |
[email protected] | 87eca18 | 2013-01-31 21:20:00 | [diff] [blame] | 63 | // RenderViewHosts, it is important to check in those WebContentsObserver |
| 64 | // methods which take a RenderViewHost that the event came from the |
| 65 | // RenderViewHost the observer cares about. |
| 66 | // |
| 67 | // Usually, observers should only care about the current RenderViewHost as |
| 68 | // returned by GetRenderViewHost(). |
| 69 | // |
| 70 | // TODO(creis, jochen): Hide the fact that there are several RenderViewHosts |
| 71 | // from the WebContentsObserver API. http://crbug.com/173325 |
Lukasz Anforowicz | f4357ca | 2017-09-07 01:43:32 | [diff] [blame] | 72 | class CONTENT_EXPORT WebContentsObserver : public IPC::Listener { |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 73 | public: |
avi | ee9b737 | 2016-06-28 20:34:43 | [diff] [blame] | 74 | // Frames and Views ---------------------------------------------------------- |
| 75 | |
nasko | 00528252 | 2015-01-22 02:30:02 | [diff] [blame] | 76 | // Called when a RenderFrame for |render_frame_host| is created in the |
| 77 | // renderer process. Use |RenderFrameDeleted| to listen for when this |
| 78 | // RenderFrame goes away. |
[email protected] | b849847b | 2013-12-10 21:57:58 | [diff] [blame] | 79 | virtual void RenderFrameCreated(RenderFrameHost* render_frame_host) {} |
| 80 | |
nasko | 00528252 | 2015-01-22 02:30:02 | [diff] [blame] | 81 | // Called when a RenderFrame for |render_frame_host| is deleted or the |
| 82 | // renderer process in which it runs it has died. Use |RenderFrameCreated| to |
| 83 | // listen for when RenderFrame objects are created. |
[email protected] | b849847b | 2013-12-10 21:57:58 | [diff] [blame] | 84 | virtual void RenderFrameDeleted(RenderFrameHost* render_frame_host) {} |
| 85 | |
nasko | 00528252 | 2015-01-22 02:30:02 | [diff] [blame] | 86 | // This method is invoked whenever one of the current frames of a WebContents |
| 87 | // swaps its RenderFrameHost with another one; for example because that frame |
| 88 | // navigated and the new content is in a different process. The |
| 89 | // RenderFrameHost that has been replaced is in |old_host|, which can be |
| 90 | // nullptr if the old RenderFrameHost was shut down or a new frame has been |
| 91 | // created and no old RenderFrameHost exists. |
| 92 | // |
| 93 | // This method, in combination with |FrameDeleted|, is appropriate for |
| 94 | // observers wishing to track the set of current RenderFrameHosts -- i.e., |
Lei Zhang | ebcc630 | 2018-01-12 19:46:45 | [diff] [blame] | 95 | // those hosts that would be visited by calling WebContents::ForEachFrame(). |
nasko | 00528252 | 2015-01-22 02:30:02 | [diff] [blame] | 96 | virtual void RenderFrameHostChanged(RenderFrameHost* old_host, |
| 97 | RenderFrameHost* new_host) {} |
| 98 | |
| 99 | // This method is invoked when a subframe associated with a WebContents is |
| 100 | // deleted or the WebContents is destroyed and the top-level frame is deleted. |
| 101 | // Use |RenderFrameHostChanged| to listen for when a RenderFrameHost object is |
| 102 | // made the current host for a frame. |
| 103 | virtual void FrameDeleted(RenderFrameHost* render_frame_host) {} |
| 104 | |
[email protected] | a86c0e96 | 2013-12-17 17:10:39 | [diff] [blame] | 105 | // This is called when a RVH is created for a WebContents, but not if it's an |
| 106 | // interstitial. |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 107 | virtual void RenderViewCreated(RenderViewHost* render_view_host) {} |
[email protected] | a86c0e96 | 2013-12-17 17:10:39 | [diff] [blame] | 108 | |
| 109 | // Called for every RenderFrameHost that's created for an interstitial. |
| 110 | virtual void RenderFrameForInterstitialPageCreated( |
| 111 | RenderFrameHost* render_frame_host) {} |
[email protected] | 87eca18 | 2013-01-31 21:20:00 | [diff] [blame] | 112 | |
| 113 | // This method is invoked when the RenderView of the current RenderViewHost |
| 114 | // is ready, e.g. because we recreated it after a crash. |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 115 | virtual void RenderViewReady() {} |
[email protected] | 87eca18 | 2013-01-31 21:20:00 | [diff] [blame] | 116 | |
| 117 | // This method is invoked when a RenderViewHost of the WebContents is |
| 118 | // deleted. Note that this does not always happen when the WebContents starts |
| 119 | // to use a different RenderViewHost, as the old RenderViewHost might get |
| 120 | // just swapped out. |
| 121 | virtual void RenderViewDeleted(RenderViewHost* render_view_host) {} |
| 122 | |
avi | 3360120 | 2015-07-11 01:39:26 | [diff] [blame] | 123 | // This method is invoked when the process for the current main |
| 124 | // RenderFrameHost exits (usually by crashing, though possibly by other |
| 125 | // means). The WebContents continues to use the RenderFrameHost, e.g. when the |
| 126 | // user reloads the current page. When the RenderFrameHost itself is deleted, |
| 127 | // the RenderFrameDeleted method will be invoked. |
[email protected] | 4d61441 | 2014-01-10 08:29:37 | [diff] [blame] | 128 | // |
avi | 3360120 | 2015-07-11 01:39:26 | [diff] [blame] | 129 | // Note that this is triggered upstream through |
| 130 | // RenderProcessHostObserver::RenderProcessExited(); for code that doesn't |
| 131 | // otherwise need to be a WebContentsObserver, that API is probably a better |
| 132 | // choice. |
[email protected] | 58d5cfe | 2013-07-10 02:40:52 | [diff] [blame] | 133 | virtual void RenderProcessGone(base::TerminationStatus status) {} |
[email protected] | 87eca18 | 2013-01-31 21:20:00 | [diff] [blame] | 134 | |
[email protected] | 02d7b6e | 2014-06-24 21:01:50 | [diff] [blame] | 135 | // This method is invoked when a WebContents swaps its visible RenderViewHost |
| 136 | // with another one, possibly changing processes. The RenderViewHost that has |
mlamouri | 8c61ffc | 2015-01-13 16:17:59 | [diff] [blame] | 137 | // been replaced is in |old_host|, which is nullptr if the old RVH was shut |
| 138 | // down. |
[email protected] | 7b712ee2 | 2013-10-03 00:57:28 | [diff] [blame] | 139 | virtual void RenderViewHostChanged(RenderViewHost* old_host, |
| 140 | RenderViewHost* new_host) {} |
[email protected] | da7a718 | 2013-09-06 08:11:11 | [diff] [blame] | 141 | |
Avi Drissman | b3d355f | 2018-01-29 20:08:18 | [diff] [blame] | 142 | // This method is invoked when a process in the WebContents becomes |
| 143 | // unresponsive. |
| 144 | virtual void OnRendererUnresponsive(RenderProcessHost* render_process_host) {} |
afakhry | 9824183 | 2016-03-11 19:27:47 | [diff] [blame] | 145 | |
avi | ee9b737 | 2016-06-28 20:34:43 | [diff] [blame] | 146 | // Navigation ---------------------------------------------------------------- |
clamy | 0e11988 | 2015-07-31 16:12:33 | [diff] [blame] | 147 | |
| 148 | // Called when a navigation started in the WebContents. |navigation_handle| |
| 149 | // is unique to a specific navigation. The same |navigation_handle| will be |
nasko | 14baf39 | 2016-02-02 02:15:38 | [diff] [blame] | 150 | // provided on subsequent calls to DidRedirectNavigation, DidFinishNavigation, |
| 151 | // and ReadyToCommitNavigation when related to this navigation. Observers |
| 152 | // should clear any references to |navigation_handle| in DidFinishNavigation, |
| 153 | // just before it is destroyed. |
clamy | 0e11988 | 2015-07-31 16:12:33 | [diff] [blame] | 154 | // |
| 155 | // Note that this is fired by navigations in any frame of the WebContents, |
| 156 | // not just the main frame. |
| 157 | // |
eugenebut | a11672fb | 2017-03-07 17:13:51 | [diff] [blame] | 158 | // Note that this is fired by same-document navigations, such as fragment |
clamy | 57f99bd2 | 2016-11-30 18:25:11 | [diff] [blame] | 159 | // navigations or pushState/replaceState, which will not result in a document |
eugenebut | a11672fb | 2017-03-07 17:13:51 | [diff] [blame] | 160 | // change. To filter these out, use NavigationHandle::IsSameDocument. |
clamy | 57f99bd2 | 2016-11-30 18:25:11 | [diff] [blame] | 161 | // |
clamy | 0e11988 | 2015-07-31 16:12:33 | [diff] [blame] | 162 | // Note that more than one navigation can be ongoing in the same frame at the |
| 163 | // same time (including the main frame). Each will get its own |
| 164 | // NavigationHandle. |
| 165 | // |
| 166 | // Note that there is no guarantee that DidFinishNavigation will be called |
| 167 | // for any particular navigation before DidStartNavigation is called on the |
| 168 | // next. |
| 169 | virtual void DidStartNavigation(NavigationHandle* navigation_handle) {} |
| 170 | |
| 171 | // Called when a navigation encountered a server redirect. |
| 172 | virtual void DidRedirectNavigation(NavigationHandle* navigation_handle) {} |
| 173 | |
clamy | b876f0a7 | 2015-09-24 20:01:05 | [diff] [blame] | 174 | // Called when the navigation is ready to be committed in a renderer. Most |
| 175 | // observers should use DidFinishNavigation instead, which happens right |
| 176 | // after the navigation commits. This method is for observers that want to |
| 177 | // initialize renderer-side state just before the RenderFrame commits the |
| 178 | // navigation. |
| 179 | // |
clamy | b876f0a7 | 2015-09-24 20:01:05 | [diff] [blame] | 180 | // This is the first point in time where a RenderFrameHost is associated with |
| 181 | // the navigation. |
clamy | efca29e | 2015-09-17 00:22:11 | [diff] [blame] | 182 | virtual void ReadyToCommitNavigation(NavigationHandle* navigation_handle) {} |
| 183 | |
clamy | b876f0a7 | 2015-09-24 20:01:05 | [diff] [blame] | 184 | // Called when a navigation finished in the WebContents. This happens when a |
| 185 | // navigation is committed, aborted or replaced by a new one. To know if the |
vabr | d9092d3 | 2016-03-16 19:03:32 | [diff] [blame] | 186 | // navigation has committed, use NavigationHandle::HasCommitted; use |
clamy | b876f0a7 | 2015-09-24 20:01:05 | [diff] [blame] | 187 | // NavigationHandle::IsErrorPage to know if the navigation resulted in an |
| 188 | // error page. |
| 189 | // |
| 190 | // If this is called because the navigation committed, then the document load |
| 191 | // will still be ongoing in the RenderFrameHost returned by |
| 192 | // |navigation_handle|. Use the document loads events such as DidStopLoading |
| 193 | // and related methods to listen for continued events from this |
| 194 | // RenderFrameHost. |
| 195 | // |
eugenebut | a11672fb | 2017-03-07 17:13:51 | [diff] [blame] | 196 | // Note that this is fired by same-document navigations, such as fragment |
clamy | 57f99bd2 | 2016-11-30 18:25:11 | [diff] [blame] | 197 | // navigations or pushState/replaceState, which will not result in a document |
eugenebut | a11672fb | 2017-03-07 17:13:51 | [diff] [blame] | 198 | // change. To filter these out, use NavigationHandle::IsSameDocument. |
clamy | 57f99bd2 | 2016-11-30 18:25:11 | [diff] [blame] | 199 | // |
clamy | b876f0a7 | 2015-09-24 20:01:05 | [diff] [blame] | 200 | // Note that |navigation_handle| will be destroyed at the end of this call, |
| 201 | // so do not keep a reference to it afterward. |
clamy | 0e11988 | 2015-07-31 16:12:33 | [diff] [blame] | 202 | virtual void DidFinishNavigation(NavigationHandle* navigation_handle) {} |
| 203 | |
avi | ee9b737 | 2016-06-28 20:34:43 | [diff] [blame] | 204 | // Navigation (obsolete and deprecated) -------------------------------------- |
| 205 | |
| 206 | // This method is invoked after the browser process starts a navigation to a |
| 207 | // pending NavigationEntry. It is not called for renderer-initiated |
| 208 | // navigations unless they are sent to the browser process via OpenURL. It may |
| 209 | // be called multiple times for a given navigation, such as a typed URL |
| 210 | // followed by a cross-process client or server redirect. |
| 211 | // |
Arthur Hemery | 0dd6581 | 2019-08-01 14:18:45 | [diff] [blame^] | 212 | // SOON TO BE DEPRECATED. Use DidStartNavigation instead. |
| 213 | // TODO(clamy): Remove this function. |
toyoshim | 0df1d3a | 2016-09-09 09:52:48 | [diff] [blame] | 214 | virtual void DidStartNavigationToPendingEntry(const GURL& url, |
| 215 | ReloadType reload_type) {} |
avi | ee9b737 | 2016-06-28 20:34:43 | [diff] [blame] | 216 | |
clamy | b876f0a7 | 2015-09-24 20:01:05 | [diff] [blame] | 217 | // Document load events ------------------------------------------------------ |
| 218 | |
Chris Hamilton | f82f2a70 | 2018-02-15 19:37:29 | [diff] [blame] | 219 | // These three methods correspond to the points in time when a document starts |
| 220 | // loading for the first time (initiates outgoing requests), when incoming |
| 221 | // data subsequently starts arriving, and when it finishes loading. |
clamy | b876f0a7 | 2015-09-24 20:01:05 | [diff] [blame] | 222 | virtual void DidStartLoading() {} |
Chris Hamilton | f82f2a70 | 2018-02-15 19:37:29 | [diff] [blame] | 223 | virtual void DidReceiveResponse() {} |
clamy | b876f0a7 | 2015-09-24 20:01:05 | [diff] [blame] | 224 | virtual void DidStopLoading() {} |
| 225 | |
| 226 | // This method is invoked once the window.document object of the main frame |
| 227 | // was created. |
| 228 | virtual void DocumentAvailableInMainFrame() {} |
| 229 | |
| 230 | // This method is invoked once the onload handler of the main frame has |
| 231 | // completed. |
| 232 | virtual void DocumentOnLoadCompletedInMainFrame() {} |
| 233 | |
| 234 | // This method is invoked when the document in the given frame finished |
| 235 | // loading. At this point, scripts marked as defer were executed, and |
| 236 | // content scripts marked "document_end" get injected into the frame. |
| 237 | virtual void DocumentLoadedInFrame(RenderFrameHost* render_frame_host) {} |
| 238 | |
avi | ee9b737 | 2016-06-28 20:34:43 | [diff] [blame] | 239 | // This method is invoked when the load is done, i.e. the spinner of the tab |
| 240 | // will stop spinning, and the onload event was dispatched. |
clamy | b876f0a7 | 2015-09-24 20:01:05 | [diff] [blame] | 241 | // |
| 242 | // If the WebContents is displaying replacement content, e.g. network error |
| 243 | // pages, DidFinishLoad is invoked for frames that were not sending |
| 244 | // navigational events before. It is safe to ignore these events. |
| 245 | virtual void DidFinishLoad(RenderFrameHost* render_frame_host, |
| 246 | const GURL& validated_url) {} |
| 247 | |
| 248 | // This method is like DidFinishLoad, but when the load failed or was |
| 249 | // cancelled, e.g. window.stop() is invoked. |
| 250 | virtual void DidFailLoad(RenderFrameHost* render_frame_host, |
| 251 | const GURL& validated_url, |
| 252 | int error_code, |
Yutaka Hirano | 16d3c5d | 2017-07-31 06:17:30 | [diff] [blame] | 253 | const base::string16& error_description) {} |
clamy | b876f0a7 | 2015-09-24 20:01:05 | [diff] [blame] | 254 | |
cjgrant | 6d1d727a | 2016-12-09 21:16:57 | [diff] [blame] | 255 | // This method is invoked when the visible security state of the page changes. |
| 256 | virtual void DidChangeVisibleSecurityState() {} |
lgarron | 662dd52 | 2015-06-08 23:20:01 | [diff] [blame] | 257 | |
[email protected] | b0f724c | 2013-09-05 04:21:13 | [diff] [blame] | 258 | // This method is invoked when content was loaded from an in-memory cache. |
| 259 | virtual void DidLoadResourceFromMemoryCache( |
jam | 91dd24e | 2016-08-12 17:16:42 | [diff] [blame] | 260 | const GURL& url, |
| 261 | const std::string& mime_type, |
| 262 | ResourceType resource_type) {} |
[email protected] | b0f724c | 2013-09-05 04:21:13 | [diff] [blame] | 263 | |
Jay Civelli | 718fd6c0 | 2018-05-11 21:04:27 | [diff] [blame] | 264 | // This method is invoked when a resource associate with the frame |
Clark DuVall | 36164bd | 2018-08-09 22:49:08 | [diff] [blame] | 265 | // |render_frame_host| has been loaded, successfully or not. |request_id| will |
| 266 | // only be populated for main frame resources. |
Jay Civelli | 116683f | 2018-03-27 19:56:23 | [diff] [blame] | 267 | virtual void ResourceLoadComplete( |
Jay Civelli | 718fd6c0 | 2018-05-11 21:04:27 | [diff] [blame] | 268 | RenderFrameHost* render_frame_host, |
Clark DuVall | 36164bd | 2018-08-09 22:49:08 | [diff] [blame] | 269 | const GlobalRequestID& request_id, |
Jay Civelli | 718fd6c0 | 2018-05-11 21:04:27 | [diff] [blame] | 270 | const mojom::ResourceLoadInfo& resource_load_info) {} |
[email protected] | b0f724c | 2013-09-05 04:21:13 | [diff] [blame] | 271 | |
Josh Karlin | daba3932 | 2019-07-17 23:24:33 | [diff] [blame] | 272 | // This method is invoked when a document or resource reads a cookie. Note |
| 273 | // that this isn't tied to any particular navigation (e.g., it may be called |
| 274 | // after a subsequent navigation commits). |
| 275 | virtual void OnCookiesRead(const GURL& url, |
| 276 | const GURL& first_party_url, |
| 277 | const net::CookieList& cookie_list, |
| 278 | bool blocked_by_policy) {} |
| 279 | |
| 280 | // This method is invoked when an attempt has been made to set |cookie|. Note |
| 281 | // that this isn't tied to any particular navigation (e.g., it may be called |
| 282 | // after a subsequent navigation commits). |
| 283 | virtual void OnCookieChange(const GURL& url, |
| 284 | const GURL& first_party_url, |
| 285 | const net::CanonicalCookie& cookie, |
| 286 | bool blocked_by_policy) {} |
| 287 | |
[email protected] | cbb1ef59 | 2013-06-05 19:49:46 | [diff] [blame] | 288 | // This method is invoked when a new non-pending navigation entry is created. |
| 289 | // This corresponds to one NavigationController entry being created |
| 290 | // (in the case of new navigations) or renavigated to (for back/forward |
| 291 | // navigations). |
| 292 | virtual void NavigationEntryCommitted( |
| 293 | const LoadCommittedDetails& load_details) {} |
| 294 | |
Sam McNally | 5c087a3 | 2017-08-25 01:46:14 | [diff] [blame] | 295 | // Invoked when the NavigationController decreased its back/forward list count |
| 296 | // by removing entries from either the front or back of its list. This is |
| 297 | // usually the result of going back and then doing a new navigation, meaning |
| 298 | // all the "forward" items are deleted. |
| 299 | // |
| 300 | // This normally happens as a result of a new navigation. It will be |
| 301 | // followed by a NavigationEntryCommitted() call for the new page that |
| 302 | // caused the pruning. It could also be a result of removing an item from |
Christian Dullweber | b13ffda | 2018-02-23 11:42:14 | [diff] [blame] | 303 | // the list to delete history or fix up after interstitials. |
Sam McNally | 5c087a3 | 2017-08-25 01:46:14 | [diff] [blame] | 304 | virtual void NavigationListPruned(const PrunedDetails& pruned_details) {} |
| 305 | |
Christian Dullweber | 1af31e6 | 2018-02-22 11:49:48 | [diff] [blame] | 306 | // Invoked when NavigationEntries have been deleted because of a history |
| 307 | // deletion. Observers should ensure that they remove all traces of the |
| 308 | // deleted entries. |
| 309 | virtual void NavigationEntriesDeleted() {} |
| 310 | |
Sam McNally | 5c087a3 | 2017-08-25 01:46:14 | [diff] [blame] | 311 | // Invoked when a NavigationEntry has changed. |
| 312 | // |
| 313 | // This will NOT be sent on navigation, interested parties should also |
| 314 | // implement NavigationEntryCommitted() to handle that case. This will be |
| 315 | // sent when the entry is updated outside of navigation (like when a new |
| 316 | // title comes). |
| 317 | virtual void NavigationEntryChanged( |
| 318 | const EntryChangedDetails& change_details) {} |
| 319 | |
[email protected] | 87eca18 | 2013-01-31 21:20:00 | [diff] [blame] | 320 | // This method is invoked when a new WebContents was created in response to |
| 321 | // an action in the observed WebContents, e.g. a link with target=_blank was |
creis | 114ca1b | 2014-11-13 23:51:46 | [diff] [blame] | 322 | // clicked. The |source_render_frame_host| is the frame in which the action |
| 323 | // took place. |
[email protected] | 26b5e32 | 2011-12-23 01:36:47 | [diff] [blame] | 324 | virtual void DidOpenRequestedURL(WebContents* new_contents, |
creis | 114ca1b | 2014-11-13 23:51:46 | [diff] [blame] | 325 | RenderFrameHost* source_render_frame_host, |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 326 | const GURL& url, |
| 327 | const Referrer& referrer, |
| 328 | WindowOpenDisposition disposition, |
pnoland | 48894465 | 2017-02-22 18:58:54 | [diff] [blame] | 329 | ui::PageTransition transition, |
pnoland | aae574e | 2017-03-06 21:04:21 | [diff] [blame] | 330 | bool started_from_context_menu, |
| 331 | bool renderer_initiated) {} |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 332 | |
nasko | 00528252 | 2015-01-22 02:30:02 | [diff] [blame] | 333 | // This method is invoked when the renderer process has completed its first |
| 334 | // paint after a non-empty layout. |
[email protected] | 5027949 | 2014-05-05 23:24:29 | [diff] [blame] | 335 | virtual void DidFirstVisuallyNonEmptyPaint() {} |
[email protected] | 9f26807 | 2013-11-07 00:02:15 | [diff] [blame] | 336 | |
[email protected] | d16609c | 2013-08-23 06:01:40 | [diff] [blame] | 337 | // When WebContents::Stop() is called, the WebContents stops loading and then |
| 338 | // invokes this method. If there are ongoing navigations, their respective |
| 339 | // failure methods will also be invoked. |
| 340 | virtual void NavigationStopped() {} |
[email protected] | 87eca18 | 2013-01-31 21:20:00 | [diff] [blame] | 341 | |
Robert Ogden | 34e9796 | 2018-09-14 23:50:27 | [diff] [blame] | 342 | // This method is invoked when the WebContents reloads all the LoFi images in |
| 343 | // the frame. LoFi is a type of Preview where Chrome shows gray boxes in place |
| 344 | // of the images on a webpage in order to conserve data for data-sensitive |
| 345 | // users. See http://bit.ly/LoFiPublicDoc. |
| 346 | virtual void DidReloadLoFiImages() {} |
| 347 | |
dominickn | 2dd142dd | 2015-10-29 05:30:50 | [diff] [blame] | 348 | // Called when there has been direct user interaction with the WebContents. |
dominickn | ad9c99d | 2015-11-06 01:52:49 | [diff] [blame] | 349 | // The type argument specifies the kind of interaction. Direct user input |
| 350 | // signalled through this callback includes: |
| 351 | // 1) any mouse down event (blink::WebInputEvent::MouseDown); |
dominickn | 5cc29a4 | 2016-03-25 03:06:22 | [diff] [blame] | 352 | // 2) the start of a scroll (blink::WebInputEvent::GestureScrollBegin); |
Dominick Ng | 37a1505 | 2018-07-17 23:56:35 | [diff] [blame] | 353 | // 3) any raw key down event (blink::WebInputEvent::RawKeyDown); and |
| 354 | // 4) any touch event (inc. scrolls) (blink::WebInputEvent::TouchStart). |
dominickn | 2dd142dd | 2015-10-29 05:30:50 | [diff] [blame] | 355 | virtual void DidGetUserInteraction(const blink::WebInputEvent::Type type) {} |
| 356 | |
[email protected] | 87eca18 | 2013-01-31 21:20:00 | [diff] [blame] | 357 | // This method is invoked when a RenderViewHost of this WebContents was |
| 358 | // configured to ignore UI events, and an UI event took place. |
| 359 | virtual void DidGetIgnoredUIEvent() {} |
| 360 | |
Francois Doray | fe4a177 | 2018-02-17 04:17:09 | [diff] [blame] | 361 | // Invoked every time the WebContents changes visibility. |
| 362 | virtual void OnVisibilityChanged(Visibility visibility) {} |
[email protected] | 3e32414 | 2012-06-25 18:26:33 | [diff] [blame] | 363 | |
estade | d0a0c99 | 2015-01-21 14:12:06 | [diff] [blame] | 364 | // Invoked when the main frame changes size. |
rouslan | 2f5993f | 2015-01-29 00:18:31 | [diff] [blame] | 365 | virtual void MainFrameWasResized(bool width_changed) {} |
estade | d0a0c99 | 2015-01-21 14:12:06 | [diff] [blame] | 366 | |
alexmos | be2f4c3 | 2015-03-10 02:30:23 | [diff] [blame] | 367 | // Invoked when the given frame changes its window.name property. |
| 368 | virtual void FrameNameChanged(RenderFrameHost* render_frame_host, |
| 369 | const std::string& name) {} |
| 370 | |
John Delaney | edd8d6c | 2019-01-25 00:23:57 | [diff] [blame] | 371 | // Called when the sticky user activation bit has been set on the frame. |
| 372 | // This will not be called for new RenderFrameHosts whose underlying |
| 373 | // FrameTreeNode was already activated. This should not be used to determine a |
| 374 | // RenderFrameHost's user activation state. |
| 375 | virtual void FrameReceivedFirstUserActivation( |
| 376 | RenderFrameHost* render_frame_host) {} |
| 377 | |
John Delaney | 0146a74 | 2019-01-25 19:25:28 | [diff] [blame] | 378 | // Invoked when the display state of the frame changes. |
| 379 | virtual void FrameDisplayStateChanged(RenderFrameHost* render_frame_host, |
| 380 | bool is_display_none) {} |
| 381 | |
| 382 | // Invoked when a frame changes size. |
| 383 | virtual void FrameSizeChanged(RenderFrameHost* render_frame_host, |
| 384 | const gfx::Size& frame_size) {} |
| 385 | |
Avi Drissman | a2ca5b14 | 2017-11-14 21:10:47 | [diff] [blame] | 386 | // This method is invoked when the title of the WebContents is set. Note that |
| 387 | // |entry| may be null if the web page whose title changed has not yet had a |
| 388 | // NavigationEntry assigned to it. |
Avi Drissman | 9300221 | 2017-09-27 03:20:52 | [diff] [blame] | 389 | virtual void TitleWasSet(NavigationEntry* entry) {} |
[email protected] | 6679890 | 2013-10-01 18:40:16 | [diff] [blame] | 390 | |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 391 | virtual void AppCacheAccessed(const GURL& manifest_url, |
| 392 | bool blocked_by_policy) {} |
| 393 | |
emaxx | e70f5e1 | 2015-05-29 11:26:00 | [diff] [blame] | 394 | // These methods are invoked when a Pepper plugin instance is created/deleted |
| 395 | // in the DOM. |
| 396 | virtual void PepperInstanceCreated() {} |
| 397 | virtual void PepperInstanceDeleted() {} |
| 398 | |
Becca Hughes | 6fe54e43 | 2018-06-09 04:18:56 | [diff] [blame] | 399 | // This method is called when the viewport fit of a WebContents changes. |
| 400 | virtual void ViewportFitChanged(blink::mojom::ViewportFit value) {} |
| 401 | |
[email protected] | 3fc07c5 | 2012-04-20 00:27:44 | [diff] [blame] | 402 | // Notification that a plugin has crashed. |
[email protected] | cf4d6e74 | 2013-01-10 14:06:42 | [diff] [blame] | 403 | // |plugin_pid| is the process ID identifying the plugin process. Note that |
nasko | 00528252 | 2015-01-22 02:30:02 | [diff] [blame] | 404 | // this ID is supplied by the renderer process, so should not be trusted. |
| 405 | // Besides, the corresponding process has probably died at this point. The ID |
| 406 | // may even have been reused by a new process. |
[email protected] | c42de73 | 2013-02-16 06:26:31 | [diff] [blame] | 407 | virtual void PluginCrashed(const base::FilePath& plugin_path, |
[email protected] | cf4d6e74 | 2013-01-10 14:06:42 | [diff] [blame] | 408 | base::ProcessId plugin_pid) {} |
[email protected] | 3fc07c5 | 2012-04-20 00:27:44 | [diff] [blame] | 409 | |
[email protected] | d16609c | 2013-08-23 06:01:40 | [diff] [blame] | 410 | // Notification that the given plugin has hung or become unhung. This |
[email protected] | 3fc07c5 | 2012-04-20 00:27:44 | [diff] [blame] | 411 | // notification is only for Pepper plugins. |
| 412 | // |
| 413 | // The plugin_child_id is the unique child process ID from the plugin. Note |
nasko | 00528252 | 2015-01-22 02:30:02 | [diff] [blame] | 414 | // that this ID is supplied by the renderer process, so should be validated |
| 415 | // before it's used for anything in case there's an exploited renderer |
| 416 | // process. |
[email protected] | 3fc07c5 | 2012-04-20 00:27:44 | [diff] [blame] | 417 | virtual void PluginHungStatusChanged(int plugin_child_id, |
[email protected] | c42de73 | 2013-02-16 06:26:31 | [diff] [blame] | 418 | const base::FilePath& plugin_path, |
[email protected] | 3fc07c5 | 2012-04-20 00:27:44 | [diff] [blame] | 419 | bool is_hung) {} |
| 420 | |
Sean Topping | bbc4a2bd | 2019-01-30 02:16:14 | [diff] [blame] | 421 | // Notifies that an inner WebContents instance has been created with the |
| 422 | // observed WebContents as its container. |inner_web_contents| has not been |
| 423 | // added to the WebContents tree at this point, but can be observed safely. |
| 424 | virtual void InnerWebContentsCreated(WebContents* inner_web_contents) {} |
| 425 | |
[email protected] | 7381d9f | 2012-09-12 20:26:22 | [diff] [blame] | 426 | // Invoked when WebContents::Clone() was used to clone a WebContents. |
| 427 | virtual void DidCloneToNewWebContents(WebContents* old_web_contents, |
| 428 | WebContents* new_web_contents) {} |
| 429 | |
[email protected] | 26b5e32 | 2011-12-23 01:36:47 | [diff] [blame] | 430 | // Invoked when the WebContents is being destroyed. Gives subclasses a chance |
[email protected] | 12a4683 | 2014-05-09 13:35:58 | [diff] [blame] | 431 | // to cleanup. After the whole loop over all WebContentsObservers has been |
mlamouri | 8c61ffc | 2015-01-13 16:17:59 | [diff] [blame] | 432 | // finished, web_contents() returns nullptr. |
[email protected] | 12a4683 | 2014-05-09 13:35:58 | [diff] [blame] | 433 | virtual void WebContentsDestroyed() {} |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 434 | |
[email protected] | 8d0f331 | 2012-08-18 01:47:53 | [diff] [blame] | 435 | // Called when the user agent override for a WebContents has been changed. |
| 436 | virtual void UserAgentOverrideSet(const std::string& user_agent) {} |
| 437 | |
nasko | 00528252 | 2015-01-22 02:30:02 | [diff] [blame] | 438 | // Invoked when new FaviconURL candidates are received from the renderer |
| 439 | // process. |
[email protected] | 5027949 | 2014-05-05 23:24:29 | [diff] [blame] | 440 | virtual void DidUpdateFaviconURL(const std::vector<FaviconURL>& candidates) {} |
[email protected] | 795c2897 | 2012-12-06 06:13:39 | [diff] [blame] | 441 | |
Chris Hamilton | eb41198f | 2018-05-24 18:41:26 | [diff] [blame] | 442 | // Called when an audio change occurs. |
| 443 | virtual void OnAudioStateChanged(bool audible) {} |
| 444 | |
wjmaclean | 2f797c78 | 2016-01-07 14:52:03 | [diff] [blame] | 445 | // Invoked when the WebContents is muted/unmuted. |
| 446 | virtual void DidUpdateAudioMutingState(bool muted) {} |
| 447 | |
[email protected] | 44470a2 | 2013-01-24 01:21:54 | [diff] [blame] | 448 | // Invoked when a pepper plugin creates and shows or destroys a fullscreen |
nasko | 00528252 | 2015-01-22 02:30:02 | [diff] [blame] | 449 | // RenderWidget. |
alexmos | 899e06f | 2016-05-13 23:08:09 | [diff] [blame] | 450 | virtual void DidShowFullscreenWidget() {} |
| 451 | virtual void DidDestroyFullscreenWidget() {} |
[email protected] | 44470a2 | 2013-01-24 01:21:54 | [diff] [blame] | 452 | |
nasko | 00528252 | 2015-01-22 02:30:02 | [diff] [blame] | 453 | // Invoked when the renderer process has toggled the tab into/out of |
| 454 | // fullscreen mode. |
bokan | ece34a8 | 2016-01-28 19:49:46 | [diff] [blame] | 455 | virtual void DidToggleFullscreenModeForTab(bool entered_fullscreen, |
| 456 | bool will_cause_resize) {} |
[email protected] | 657c8e0 | 2014-03-19 19:18:37 | [diff] [blame] | 457 | |
Becca Hughes | fd5d8f89 | 2018-06-14 18:23:36 | [diff] [blame] | 458 | // Signals that |rfh| has the current fullscreen element. This is invoked |
| 459 | // when: |
| 460 | // 1) an element in this frame enters fullscreen or in nested fullscreen, or |
| 461 | // 2) after an element in a descendant frame exits fullscreen and makes |
| 462 | // this frame own the current fullscreen element again. |
| 463 | virtual void DidAcquireFullscreen(RenderFrameHost* rfh) {} |
| 464 | |
[email protected] | 20ca038 | 2013-02-28 19:50:07 | [diff] [blame] | 465 | // Invoked when an interstitial page is attached or detached. |
| 466 | virtual void DidAttachInterstitialPage() {} |
| 467 | virtual void DidDetachInterstitialPage() {} |
| 468 | |
[email protected] | 17e286e | 2013-03-01 23:29:39 | [diff] [blame] | 469 | // Invoked before a form repost warning is shown. |
| 470 | virtual void BeforeFormRepostWarningShow() {} |
| 471 | |
Chris Hamilton | 3b3e315d | 2018-09-19 13:16:21 | [diff] [blame] | 472 | // Invoked when the beforeunload handler fires. |proceed| is set to true if |
| 473 | // the beforeunload can safely proceed, otherwise it should be interrupted. |
| 474 | // The time is from the renderer process. |
| 475 | virtual void BeforeUnloadFired(bool proceed, |
| 476 | const base::TimeTicks& proceed_time) {} |
[email protected] | 6d65a46 | 2013-06-21 21:29:12 | [diff] [blame] | 477 | |
| 478 | // Invoked when a user cancels a before unload dialog. |
| 479 | virtual void BeforeUnloadDialogCancelled() {} |
| 480 | |
dmazzoni | dd3d51a7 | 2016-12-14 18:41:01 | [diff] [blame] | 481 | // Called when accessibility events or location changes are received |
| 482 | // from a render frame, but only when the accessibility mode has the |
Doug Turner | 63f3c7b | 2017-07-29 05:10:01 | [diff] [blame] | 483 | // ui::AXMode::kWebContents flag set. |
Dominic Mazzoni | a7b0edb2 | 2017-08-09 16:32:51 | [diff] [blame] | 484 | virtual void AccessibilityEventReceived( |
Dominic Mazzoni | ccbaa9b | 2018-06-06 07:44:23 | [diff] [blame] | 485 | const AXEventNotificationDetails& details) {} |
dmazzoni | 2400c46 | 2016-08-23 15:07:13 | [diff] [blame] | 486 | virtual void AccessibilityLocationChangesReceived( |
| 487 | const std::vector<AXLocationChangeNotificationDetails>& details) {} |
| 488 | |
[email protected] | 37b64c5 | 2014-07-11 21:14:05 | [diff] [blame] | 489 | // Invoked when theme color is changed to |theme_color|. |
Alan Cutter | 92d5925 | 2019-03-29 02:32:33 | [diff] [blame] | 490 | virtual void DidChangeThemeColor(base::Optional<SkColor> theme_color) {} |
[email protected] | e710476 | 2014-06-20 19:17:25 | [diff] [blame] | 491 | |
dalecurtis | 88c24007 | 2015-12-09 02:11:18 | [diff] [blame] | 492 | // Invoked when media is playing or paused. |id| is unique per player and per |
| 493 | // RenderFrameHost. There may be multiple players within a RenderFrameHost |
| 494 | // and subsequently within a WebContents. MediaStartedPlaying() will always |
| 495 | // be followed by MediaStoppedPlaying() after player teardown. Observers must |
| 496 | // release all stored copies of |id| when MediaStoppedPlaying() is received. |
Mounir Lamouri | 366dd847 | 2018-06-19 17:20:04 | [diff] [blame] | 497 | // |has_video| and |has_audio| can both be false in cases where the media |
| 498 | // is playing muted and should be considered as inaudible for all intent and |
| 499 | // purposes. |
billorr | 21c005d | 2016-11-17 03:57:04 | [diff] [blame] | 500 | struct MediaPlayerInfo { |
Becca Hughes | 3f92136 | 2017-06-08 14:08:36 | [diff] [blame] | 501 | MediaPlayerInfo(bool has_video, bool has_audio) |
| 502 | : has_video(has_video), has_audio(has_audio) {} |
billorr | 21c005d | 2016-11-17 03:57:04 | [diff] [blame] | 503 | bool has_video; |
Becca Hughes | 3f92136 | 2017-06-08 14:08:36 | [diff] [blame] | 504 | bool has_audio; |
billorr | 21c005d | 2016-11-17 03:57:04 | [diff] [blame] | 505 | }; |
François Beaufort | ddaf8a8 | 2018-07-16 16:43:12 | [diff] [blame] | 506 | |
billorr | 21c005d | 2016-11-17 03:57:04 | [diff] [blame] | 507 | virtual void MediaStartedPlaying(const MediaPlayerInfo& video_type, |
| 508 | const MediaPlayerId& id) {} |
Becca Hughes | 220bfc10 | 2017-11-14 18:24:07 | [diff] [blame] | 509 | enum class MediaStoppedReason { |
| 510 | // The media was stopped for an unspecified reason. |
| 511 | kUnspecified, |
| 512 | |
| 513 | // The media was stopped because it reached the end of the stream. |
| 514 | kReachedEndOfStream, |
| 515 | }; |
| 516 | virtual void MediaStoppedPlaying( |
| 517 | const MediaPlayerInfo& video_type, |
| 518 | const MediaPlayerId& id, |
| 519 | WebContentsObserver::MediaStoppedReason reason) {} |
peconn | 25795152 | 2017-06-09 18:24:59 | [diff] [blame] | 520 | virtual void MediaResized(const gfx::Size& size, const MediaPlayerId& id) {} |
Peter E Conn | eccb34c2 | 2017-09-08 09:37:58 | [diff] [blame] | 521 | // Invoked when media enters or exits fullscreen. We must use a heuristic |
| 522 | // to determine this as it is not trivial for media with custom controls. |
| 523 | // There is a slight delay between media entering or exiting fullscreen |
| 524 | // and it being detected. |
| 525 | virtual void MediaEffectivelyFullscreenChanged(bool is_fullscreen) {} |
François Beaufort | a2f0a3ca | 2018-08-28 12:46:11 | [diff] [blame] | 526 | virtual void MediaPictureInPictureChanged(bool is_picture_in_picture) {} |
Becca Hughes | 9f6fd4b8 | 2017-06-15 10:01:40 | [diff] [blame] | 527 | virtual void MediaMutedStatusChanged(const MediaPlayerId& id, bool muted) {} |
prashantv | 0c9b968d2 | 2015-03-26 00:58:54 | [diff] [blame] | 528 | |
mcnee | 432e47d | 2015-11-09 19:37:46 | [diff] [blame] | 529 | // Invoked when the renderer process changes the page scale factor. |
| 530 | virtual void OnPageScaleFactorChanged(float page_scale_factor) {} |
| 531 | |
Archana Simha | f67090c | 2019-05-06 23:43:23 | [diff] [blame] | 532 | // Invoked when a paste event occurs. |
| 533 | virtual void OnPaste() {} |
| 534 | |
[email protected] | 64ffefa | 2014-05-10 12:06:33 | [diff] [blame] | 535 | // Invoked if an IPC message is coming from a specific RenderFrameHost. |
| 536 | virtual bool OnMessageReceived(const IPC::Message& message, |
| 537 | RenderFrameHost* render_frame_host); |
| 538 | |
Michael Thiessen | 896405db | 2017-07-20 17:52:32 | [diff] [blame] | 539 | // Notification that the |render_widget_host| for this WebContents has gained |
| 540 | // focus. |
| 541 | virtual void OnWebContentsFocused(RenderWidgetHost* render_widget_host) {} |
calamity | 7fe55ce | 2015-04-10 03:59:37 | [diff] [blame] | 542 | |
Michael Thiessen | 896405db | 2017-07-20 17:52:32 | [diff] [blame] | 543 | // Notification that the |render_widget_host| for this WebContents has lost |
| 544 | // focus. |
| 545 | virtual void OnWebContentsLostFocus(RenderWidgetHost* render_widget_host) {} |
zijiehe | 3bee08e2 | 2017-05-17 04:14:46 | [diff] [blame] | 546 | |
Jeff Fisher | 709b4c5 | 2019-07-29 20:07:34 | [diff] [blame] | 547 | // Notification that a RenderFrameHost inside this WebContents has updated |
| 548 | // its focused element. |details| contains information on the element |
| 549 | // that has received focus. This allows for observing focus changes |
| 550 | // within WebContents, as opposed to OnWebContentsFocused/LostFocus |
| 551 | // which allows observation that the RenderWidgetHost for the |
| 552 | // WebContents has gained/lost focus. |
| 553 | virtual void OnFocusChangedInPage(FocusedNodeDetails* details) {} |
| 554 | |
Sam McNally | 145fb17 | 2017-05-10 00:13:23 | [diff] [blame] | 555 | // Notifies that the manifest URL for the main frame changed to |
| 556 | // |manifest_url|. This will be invoked when a document with a manifest loads |
| 557 | // or when the manifest URL changes (possibly to nothing). It is not invoked |
| 558 | // when a document with no manifest loads. During document load, if the |
| 559 | // document has both a manifest and a favicon, DidUpdateWebManifestURL() will |
| 560 | // be invoked before DidUpdateFaviconURL(). |
| 561 | virtual void DidUpdateWebManifestURL( |
| 562 | const base::Optional<GURL>& manifest_url) {} |
| 563 | |
Ben Goodger | 9e24929e | 2017-07-21 03:13:40 | [diff] [blame] | 564 | // Called to give the embedder an opportunity to bind an interface request |
| 565 | // from a frame. If the request can be bound, |interface_pipe| will be taken. |
| 566 | virtual void OnInterfaceRequestFromFrame( |
| 567 | RenderFrameHost* render_frame_host, |
| 568 | const std::string& interface_name, |
| 569 | mojo::ScopedMessagePipeHandle* interface_pipe) {} |
| 570 | |
Yiming Zhou | dd60b0b | 2018-07-20 18:51:35 | [diff] [blame] | 571 | // Notifies that the RenderWidgetCompositor has issued a draw command. An |
| 572 | // observer can use this method to detect when Chrome visually updated a |
| 573 | // tab. |
| 574 | virtual void DidCommitAndDrawCompositorFrame() {} |
| 575 | |
Raymond Toy | e413650c | 2018-08-31 00:12:47 | [diff] [blame] | 576 | // Called when "audible" playback starts or stops on a WebAudio AudioContext. |
| 577 | using AudioContextId = std::pair<RenderFrameHost*, int>; |
| 578 | virtual void AudioContextPlaybackStarted( |
| 579 | const AudioContextId& audio_context_id) {} |
| 580 | virtual void AudioContextPlaybackStopped( |
| 581 | const AudioContextId& audio_context_id) {} |
| 582 | |
[email protected] | c47317e | 2012-06-20 22:35:31 | [diff] [blame] | 583 | // IPC::Listener implementation. |
Lukasz Anforowicz | cf0a94a | 2017-08-31 19:10:09 | [diff] [blame] | 584 | // DEPRECATED: Use (i.e. override) the other overload instead: |
| 585 | // virtual bool OnMessageReceived(const IPC::Message& message, |
| 586 | // RenderFrameHost* render_frame_host); |
| 587 | // TODO(https://crbug.com/758026): Delete this overload when possible. |
dcheng | e933b3e | 2014-10-21 11:44:09 | [diff] [blame] | 588 | bool OnMessageReceived(const IPC::Message& message) override; |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 589 | |
lucinka.brozkova | c25f7fb9 | 2014-09-04 06:42:56 | [diff] [blame] | 590 | WebContents* web_contents() const; |
| 591 | |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 592 | protected: |
[email protected] | 26b5e32 | 2011-12-23 01:36:47 | [diff] [blame] | 593 | // Use this constructor when the object is tied to a single WebContents for |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 594 | // its entire lifetime. |
[email protected] | 26b5e32 | 2011-12-23 01:36:47 | [diff] [blame] | 595 | explicit WebContentsObserver(WebContents* web_contents); |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 596 | |
[email protected] | b172aee | 2012-04-10 17:05:26 | [diff] [blame] | 597 | // Use this constructor when the object wants to observe a WebContents for |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 598 | // part of its lifetime. It can then call Observe() to start and stop |
| 599 | // observing. |
| 600 | WebContentsObserver(); |
| 601 | |
dcheng | e933b3e | 2014-10-21 11:44:09 | [diff] [blame] | 602 | ~WebContentsObserver() override; |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 603 | |
[email protected] | 26b5e32 | 2011-12-23 01:36:47 | [diff] [blame] | 604 | // Start observing a different WebContents; used with the default constructor. |
| 605 | void Observe(WebContents* web_contents); |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 606 | |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 607 | private: |
[email protected] | 8ff00d7 | 2012-10-23 19:12:21 | [diff] [blame] | 608 | friend class WebContentsImpl; |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 609 | |
[email protected] | 12a4683 | 2014-05-09 13:35:58 | [diff] [blame] | 610 | void ResetWebContents(); |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 611 | |
[email protected] | b172aee | 2012-04-10 17:05:26 | [diff] [blame] | 612 | WebContentsImpl* web_contents_; |
[email protected] | d8c66043 | 2011-12-22 20:51:25 | [diff] [blame] | 613 | |
| 614 | DISALLOW_COPY_AND_ASSIGN(WebContentsObserver); |
| 615 | }; |
| 616 | |
| 617 | } // namespace content |
| 618 | |
| 619 | #endif // CONTENT_PUBLIC_BROWSER_WEB_CONTENTS_OBSERVER_H_ |