blob: fd08f312145a5d9238c794515f9c918f03e6a197 [file] [log] [blame]
Avi Drissman60039d42022-09-13 21:49:051// Copyright 2014 The Chromium Authors
[email protected]c64631652009-04-29 22:24:312// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]22401dc2014-03-21 01:38:575#ifndef EXTENSIONS_BROWSER_EXTENSION_HOST_H_
6#define EXTENSIONS_BROWSER_EXTENSION_HOST_H_
[email protected]c64631652009-04-29 22:24:317
avic9cec102015-12-23 00:39:268#include <stdint.h>
9
dchengf5d241082016-04-21 03:43:1110#include <memory>
[email protected]caf706f2010-10-26 17:54:0811#include <string>
David Bertoni3e1e9fa2018-08-29 20:39:3012#include <unordered_map>
[email protected]8a17bd52009-06-06 08:19:4913
Devlin Cronin36eecdae02022-07-07 18:15:0814#include "base/callback.h"
Keishi Hattori0e45c022021-11-27 09:25:5215#include "base/memory/raw_ptr.h"
danakj62dd09e12021-02-05 04:23:3516#include "base/memory/weak_ptr.h"
chirantan79788f62015-02-02 23:57:2517#include "base/observer_list.h"
[email protected]bd5a3742013-09-29 18:06:1318#include "base/timer/elapsed_timer.h"
Guido Urdaneta73fa6632019-01-14 18:46:2619#include "content/public/browser/media_stream_request.h"
[email protected]674bc592011-12-20 23:00:4220#include "content/public/browser/web_contents_delegate.h"
[email protected]d8c660432011-12-22 20:51:2521#include "content/public/browser/web_contents_observer.h"
yozd61dfe192015-02-21 01:30:3722#include "extensions/browser/deferred_start_render_host.h"
[email protected]0b9de032014-03-15 05:47:0123#include "extensions/browser/extension_function_dispatcher.h"
limasdfbbaa913d2015-03-02 23:52:3324#include "extensions/browser/extension_registry_observer.h"
Julie Jeongeun Kim73c8cc32021-02-26 03:17:5925#include "extensions/common/mojom/view_type.mojom.h"
[email protected]88b50b62013-09-01 23:05:0626#include "extensions/common/stack_frame.h"
[email protected]5de634712011-03-02 00:20:1927
[email protected]f3b1a082011-11-18 00:34:3028namespace content {
[email protected]9fe42042013-10-29 21:13:3329class BrowserContext;
[email protected]f3b1a082011-11-18 00:34:3030class RenderProcessHost;
[email protected]b6583592012-01-25 19:52:3331class SiteInstance;
[email protected]f3b1a082011-11-18 00:34:3032}
33
[email protected]1c321ee2012-05-21 03:02:3434namespace extensions {
35class Extension;
[email protected]6c0f179f2014-03-19 11:04:4136class ExtensionHostDelegate;
chirantan79788f62015-02-02 23:57:2537class ExtensionHostObserver;
kalmanfcece452015-02-18 18:20:4238class ExtensionHostQueue;
[email protected]1c321ee2012-05-21 03:02:3439
danakj62dd09e12021-02-05 04:23:3540// This class is the browser component of an extension component's page.
[email protected]c64631652009-04-29 22:24:3141// It handles setting up the renderer process, if needed, with special
42// privileges available to extensions. It may have a view to be shown in the
[email protected]2d2f6cfc2011-05-06 21:09:3343// browser UI, or it may be hidden.
[email protected]22401dc2014-03-21 01:38:5744//
45// If you are adding code that only affects visible extension views (and not
46// invisible background pages) you should add it to ExtensionViewHost.
yozd61dfe192015-02-21 01:30:3747class ExtensionHost : public DeferredStartRenderHost,
48 public content::WebContentsDelegate,
[email protected]d8c660432011-12-22 20:51:2549 public content::WebContentsObserver,
[email protected]e95ad332009-08-03 19:44:2550 public ExtensionFunctionDispatcher::Delegate,
limasdfbbaa913d2015-03-02 23:52:3351 public ExtensionRegistryObserver {
[email protected]c64631652009-04-29 22:24:3152 public:
Devlin Cronin36eecdae02022-07-07 18:15:0853 using CloseHandler = base::OnceCallback<void(ExtensionHost*)>;
54
[email protected]3a1dc572012-07-31 22:25:1355 ExtensionHost(const Extension* extension,
[email protected]b6583592012-01-25 19:52:3356 content::SiteInstance* site_instance,
Julie Jeongeun Kim73c8cc32021-02-26 03:17:5957 const GURL& url,
58 mojom::ViewType host_type);
Peter Boström951cf77e2021-09-22 00:02:5959
60 ExtensionHost(const ExtensionHost&) = delete;
61 ExtensionHost& operator=(const ExtensionHost&) = delete;
62
dcheng9168b2f2014-10-21 12:38:2463 ~ExtensionHost() override;
[email protected]c64631652009-04-29 22:24:3164
Karan Bhatiaee1e6a52017-11-09 21:32:5165 // This may be null if the extension has been or is being unloaded.
[email protected]3a1dc572012-07-31 22:25:1366 const Extension* extension() const { return extension_; }
Karan Bhatiaee1e6a52017-11-09 21:32:5167
[email protected]2d2f6cfc2011-05-06 21:09:3368 const std::string& extension_id() const { return extension_id_; }
[email protected]3a7d7d32012-01-05 17:44:0169 content::WebContents* host_contents() const { return host_contents_.get(); }
danakj62dd09e12021-02-05 04:23:3570 content::RenderFrameHost* main_frame_host() const { return main_frame_host_; }
[email protected]f3b1a082011-11-18 00:34:3071 content::RenderProcessHost* render_process_host() const;
kalmanfd474fa2015-03-16 22:30:5772 bool has_loaded_once() const { return has_loaded_once_; }
rdevlin.croninb48a98e2015-05-01 00:00:2873 const GURL& initial_url() const { return initial_url_; }
[email protected]e95ad332009-08-03 19:44:2574 bool document_element_available() const {
75 return document_element_available_;
76 }
[email protected]01f829a2010-03-17 18:20:3177
[email protected]96e6a1032013-11-28 06:58:0378 content::BrowserContext* browser_context() { return browser_context_; }
[email protected]9fe42042013-10-29 21:13:3379
Julie Jeongeun Kim73c8cc32021-02-26 03:17:5980 mojom::ViewType extension_host_type() const { return extension_host_type_; }
Devlin Cronin3b8567d212020-07-30 16:31:4781
Devlin Cronin36eecdae02022-07-07 18:15:0882 // Sets the callback responsible for closing the ExtensionHost in response to
83 // a WebContents::CloseContents() call (which is triggered from e.g.
84 // calling `window.close()`). This is done separately from the constructor as
85 // some callsites create an ExtensionHost prior to the object that is
86 // responsible for later closing it, but must be done before `CloseContents()`
87 // can be called.
88 void SetCloseHandler(CloseHandler close_handler);
89
Devlin Cronin3b8567d212020-07-30 16:31:4790 // Returns the last committed URL of the associated WebContents.
91 const GURL& GetLastCommittedURL() const;
[email protected]f8e55e72010-02-25 06:13:4392
danakj62dd09e12021-02-05 04:23:3593 // Returns true if the renderer main frame exists.
94 bool IsRendererLive() const;
[email protected]7c6877d2009-06-19 13:56:2595
danakj62dd09e12021-02-05 04:23:3596 // Prepares to initializes our RenderFrameHost by creating the main frame and
97 // navigating `host_contents_` to the initial url. This happens delayed to
98 // avoid locking the UI.
99 void CreateRendererSoon();
[email protected]bbc945542009-07-26 00:11:42100
rdevlin.cronin42efb7dd2015-02-11 17:50:52101 // Closes this host (results in [possibly asynchronous] deletion).
102 void Close();
103
chirantan79788f62015-02-02 23:57:25104 // Typical observer interface.
105 void AddObserver(ExtensionHostObserver* observer);
106 void RemoveObserver(ExtensionHostObserver* observer);
107
chirantan669993c2015-03-05 23:38:33108 // Called when an event is dispatched to the event page associated with this
109 // ExtensionHost.
110 void OnBackgroundEventDispatched(const std::string& event_name, int event_id);
chirantan79788f62015-02-02 23:57:25111
112 // Called by the ProcessManager when a network request is started by the
113 // extension corresponding to this ExtensionHost.
avic9cec102015-12-23 00:39:26114 void OnNetworkRequestStarted(uint64_t request_id);
chirantan79788f62015-02-02 23:57:25115
116 // Called by the ProcessManager when a previously started network request is
117 // finished.
avic9cec102015-12-23 00:39:26118 void OnNetworkRequestDone(uint64_t request_id);
chirantan79788f62015-02-02 23:57:25119
Devlin Croninccf3b9d2022-06-30 02:16:16120 // Returns true if the ExtensionHost is allowed to be navigated.
121 bool ShouldAllowNavigations() const;
122
yozd61dfe192015-02-21 01:30:37123 // content::WebContentsObserver:
rdevlin.cronin6f42c2522015-06-19 18:58:51124 bool OnMessageReceived(const IPC::Message& message,
125 content::RenderFrameHost* host) override;
danakj62dd09e12021-02-05 04:23:35126 void RenderFrameCreated(content::RenderFrameHost* frame_host) override;
Henrique Ferreiro2a6905f82022-02-09 10:14:50127 void RenderFrameHostChanged(content::RenderFrameHost* old_host,
128 content::RenderFrameHost* new_host) override;
Dave Tapuska7052b7c52021-10-18 17:30:53129 void PrimaryMainFrameRenderProcessGone(
130 base::TerminationStatus status) override;
Sreeja Kamishetty49783302022-01-28 17:52:25131 void PrimaryMainDocumentElementAvailable() override;
fdegans6ce28f52015-03-19 12:52:22132 void DidStopLoading() override;
[email protected]952a68e2011-11-17 00:36:10133
yozd61dfe192015-02-21 01:30:37134 // content::WebContentsDelegate:
mathiash72a5e462014-11-19 08:18:50135 content::JavaScriptDialogManager* GetJavaScriptDialogManager(
136 content::WebContents* source) override;
dcheng9168b2f2014-10-21 12:38:24137 void AddNewContents(content::WebContents* source,
erikchenbee5c9622018-04-27 19:30:25138 std::unique_ptr<content::WebContents> new_contents,
Joel Hockey891e88062020-04-30 05:38:44139 const GURL& target_url,
dcheng9168b2f2014-10-21 12:38:24140 WindowOpenDisposition disposition,
Brad Triebwasser767c27a2022-08-25 22:56:05141 const blink::mojom::WindowFeatures& window_features,
dcheng9168b2f2014-10-21 12:38:24142 bool user_gesture,
143 bool* was_blocked) override;
144 void CloseContents(content::WebContents* contents) override;
145 void RequestMediaAccessPermission(
[email protected]0b9383a2012-10-26 00:58:16146 content::WebContents* web_contents,
[email protected]33662e52013-01-07 21:31:09147 const content::MediaStreamRequest& request,
Mark Pilgrim57499082018-06-12 12:38:30148 content::MediaResponseCallback callback) override;
Raymes Khouryad7c24a12018-03-05 23:22:58149 bool CheckMediaAccessPermission(content::RenderFrameHost* render_frame_host,
dcheng9168b2f2014-10-21 12:38:24150 const GURL& security_origin,
Antonio Gomesc8b734b2019-06-05 18:22:16151 blink::mojom::MediaStreamType type) override;
danakj77eb7e82020-01-09 19:38:46152 bool IsNeverComposited(content::WebContents* web_contents) override;
Becca Hughes112832e2019-06-11 17:19:02153 content::PictureInPictureResult EnterPictureInPicture(
François Beaufort1388f2892022-01-29 08:22:47154 content::WebContents* web_contents) override;
François Beaufort48cf2722018-08-28 09:33:52155 void ExitPictureInPicture() override;
Kuznetsov Alexey1a516bd2021-08-04 23:49:05156 std::string GetTitleForMediaControls(
157 content::WebContents* web_contents) override;
[email protected]c64631652009-04-29 22:24:31158
limasdfbbaa913d2015-03-02 23:52:33159 // ExtensionRegistryObserver:
rockot494f0072015-07-29 17:58:07160 void OnExtensionReady(content::BrowserContext* browser_context,
161 const Extension* extension) override;
limasdfbbaa913d2015-03-02 23:52:33162 void OnExtensionUnloaded(content::BrowserContext* browser_context,
163 const Extension* extension,
limasdf0deef2042017-05-03 19:17:17164 UnloadedExtensionReason reason) override;
[email protected]e95ad332009-08-03 19:44:25165
[email protected]45a73d52013-11-26 00:10:55166 protected:
kalmanfd474fa2015-03-16 22:30:57167 // Called each time this ExtensionHost completes a load finishes loading,
168 // before any stop-loading notifications or observer methods are called.
169 virtual void OnDidStopFirstLoad();
[email protected]45a73d52013-11-26 00:10:55170
[email protected]91abb922013-12-03 18:39:56171 // Navigates to the initial page.
172 virtual void LoadInitialURL();
173
[email protected]45a73d52013-11-26 00:10:55174 // Returns true if we're hosting a background page.
175 virtual bool IsBackgroundPage() const;
176
[email protected]c64631652009-04-29 22:24:31177 private:
yozd61dfe192015-02-21 01:30:37178 // DeferredStartRenderHost:
danakj62dd09e12021-02-05 04:23:35179 void CreateRendererNow() override;
yozd61dfe192015-02-21 01:30:37180
[email protected]34f128d2011-01-25 19:07:44181 // Message handlers.
chirantan669993c2015-03-05 23:38:33182 void OnEventAck(int event_id);
[email protected]7042b682012-04-19 22:57:51183 void OnIncrementLazyKeepaliveCount();
184 void OnDecrementLazyKeepaliveCount();
[email protected]34f128d2011-01-25 19:07:44185
Henrique Ferreiro2a6905f82022-02-09 10:14:50186 void MaybeNotifyRenderProcessReady();
danakj62dd09e12021-02-05 04:23:35187 void NotifyRenderProcessReady();
188
kalmanfd474fa2015-03-16 22:30:57189 // Records UMA for load events.
190 void RecordStopLoadingUMA();
191
[email protected]6c0f179f2014-03-19 11:04:41192 // Delegate for functionality that cannot exist in the extensions module.
dchengf5d241082016-04-21 03:43:11193 std::unique_ptr<ExtensionHostDelegate> delegate_;
[email protected]6c0f179f2014-03-19 11:04:41194
[email protected]c64631652009-04-29 22:24:31195 // The extension that we're hosting in this view.
Keishi Hattori0e45c022021-11-27 09:25:52196 raw_ptr<const Extension> extension_;
[email protected]c64631652009-04-29 22:24:31197
[email protected]2d2f6cfc2011-05-06 21:09:33198 // Id of extension that we're hosting in this view.
199 const std::string extension_id_;
200
[email protected]96e6a1032013-11-28 06:58:03201 // The browser context that this host is tied to.
Keishi Hattori0e45c022021-11-27 09:25:52202 raw_ptr<content::BrowserContext> browser_context_;
[email protected]8a17bd52009-06-06 08:19:49203
[email protected]c64631652009-04-29 22:24:31204 // The host for our HTML content.
dchengf5d241082016-04-21 03:43:11205 std::unique_ptr<content::WebContents> host_contents_;
[email protected]c64631652009-04-29 22:24:31206
danakj62dd09e12021-02-05 04:23:35207 // A pointer to the current or speculative main frame in `host_contents_`. We
208 // can't access this frame through the `host_contents_` directly as it does
209 // not expose the speculative main frame. While navigating to a still-loading
210 // speculative main frame, we want to send messages to it rather than the
211 // current frame.
Keishi Hattori0e45c022021-11-27 09:25:52212 raw_ptr<content::RenderFrameHost> main_frame_host_;
[email protected]4f4d42a2011-12-02 02:42:49213
danakj62dd09e12021-02-05 04:23:35214 // Whether CreateRendererNow was called before the extension was ready.
215 bool is_renderer_creation_pending_ = false;
rockot494f0072015-07-29 17:58:07216
Devlin Cronin30eb24f2021-09-17 19:26:43217 // Whether ExtensionHostCreated() event has been fired, since
218 // RenderFrameCreated is triggered by every main frame that is created,
danakj62dd09e12021-02-05 04:23:35219 // including during a cross-site navigation which uses a new main frame.
Lukasz Anforowiczd2cae3042020-04-01 20:37:36220 bool has_creation_notification_already_fired_ = false;
221
kalmanfd474fa2015-03-16 22:30:57222 // Whether the ExtensionHost has finished loading some content at least once.
223 // There may be subsequent loads - such as reloads and navigations - and this
224 // will not affect its value (it will remain true).
danakj62dd09e12021-02-05 04:23:35225 bool has_loaded_once_ = false;
[email protected]c64631652009-04-29 22:24:31226
[email protected]e95ad332009-08-03 19:44:25227 // True if the main frame has finished parsing.
danakj62dd09e12021-02-05 04:23:35228 bool document_element_available_ = false;
[email protected]e95ad332009-08-03 19:44:25229
[email protected]952a68e2011-11-17 00:36:10230 // The original URL of the page being hosted.
231 GURL initial_url_;
[email protected]e916901c2009-05-07 00:14:31232
chirantan79788f62015-02-02 23:57:25233 // Messages sent out to the renderer that have not been acknowledged yet.
David Bertoni3e1e9fa2018-08-29 20:39:30234 // Maps event ID to event name.
235 std::unordered_map<int, std::string> unacked_messages_;
chirantan79788f62015-02-02 23:57:25236
[email protected]720ad1312012-02-27 23:07:36237 // The type of view being hosted.
Julie Jeongeun Kim73c8cc32021-02-26 03:17:59238 mojom::ViewType extension_host_type_;
[email protected]7b291f92009-08-14 05:43:53239
kalman0f101ac2015-05-06 01:23:17240 // Measures how long since the ExtensionHost object was created. This can be
241 // used to measure the responsiveness of UI. For example, it's important to
242 // keep this as low as possible for popups. Contrast this to |load_start_|,
243 // for which a low value does not necessarily mean a responsive UI, as
244 // ExtensionHosts may sit in an ExtensionHostQueue for a long time.
245 base::ElapsedTimer create_start_;
246
247 // Measures how long since the initial URL started loading. This timer is
248 // started only once the ExtensionHost has exited the ExtensionHostQueue.
dchengf5d241082016-04-21 03:43:11249 std::unique_ptr<base::ElapsedTimer> load_start_;
[email protected]cc2c3432009-11-06 17:24:36250
Devlin Cronin36eecdae02022-07-07 18:15:08251 CloseHandler close_handler_;
252 // Whether the close handler has been previously invoked.
253 bool called_close_handler_ = false;
254
Trent Apteda250ec3ab2018-08-19 08:52:19255 base::ObserverList<ExtensionHostObserver>::Unchecked observer_list_;
chirantan79788f62015-02-02 23:57:25256
danakj62dd09e12021-02-05 04:23:35257 base::WeakPtrFactory<ExtensionHost> weak_ptr_factory_{this};
[email protected]c64631652009-04-29 22:24:31258};
259
[email protected]3a1dc572012-07-31 22:25:13260} // namespace extensions
261
[email protected]22401dc2014-03-21 01:38:57262#endif // EXTENSIONS_BROWSER_EXTENSION_HOST_H_