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