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