blob: 3e30c9abcf81ef75c414f4460e3594c5ff19df80 [file] [log] [blame]
[email protected]22401dc2014-03-21 01:38:571// Copyright 2014 The Chromium Authors. All rights reserved.
[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>
chirantan79788f62015-02-02 23:57:2511#include <set>
[email protected]caf706f2010-10-26 17:54:0812#include <string>
[email protected]8a17bd52009-06-06 08:19:4913
[email protected]a808bc52012-02-14 03:20:3714#include "base/logging.h"
avic9cec102015-12-23 00:39:2615#include "base/macros.h"
chirantan79788f62015-02-02 23:57:2516#include "base/observer_list.h"
[email protected]bd5a3742013-09-29 18:06:1317#include "base/timer/elapsed_timer.h"
[email protected]674bc592011-12-20 23:00:4218#include "content/public/browser/web_contents_delegate.h"
[email protected]d8c660432011-12-22 20:51:2519#include "content/public/browser/web_contents_observer.h"
yozd61dfe192015-02-21 01:30:3720#include "extensions/browser/deferred_start_render_host.h"
[email protected]0b9de032014-03-15 05:47:0121#include "extensions/browser/extension_function_dispatcher.h"
limasdfbbaa913d2015-03-02 23:52:3322#include "extensions/browser/extension_registry_observer.h"
[email protected]88b50b62013-09-01 23:05:0623#include "extensions/common/stack_frame.h"
[email protected]cb2edf22013-04-01 20:25:2324#include "extensions/common/view_type.h"
[email protected]5de634712011-03-02 00:20:1925
[email protected]ea6ad01a2011-12-21 21:53:4926class PrefsTabHelper;
[email protected]c64631652009-04-29 22:24:3127
[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]5626b0892012-02-20 14:46:5831class RenderWidgetHostView;
[email protected]b6583592012-01-25 19:52:3332class SiteInstance;
[email protected]f3b1a082011-11-18 00:34:3033}
34
[email protected]1c321ee52012-05-21 03:02:3435namespace extensions {
36class Extension;
[email protected]6c0f179f2014-03-19 11:04:4137class ExtensionHostDelegate;
chirantan79788f62015-02-02 23:57:2538class ExtensionHostObserver;
kalmanfcece452015-02-18 18:20:4239class ExtensionHostQueue;
[email protected]44f4b132012-07-17 20:36:5740class WindowController;
[email protected]1c321ee52012-05-21 03:02:3441
[email protected]c64631652009-04-29 22:24:3142// This class is the browser component of an extension component's RenderView.
43// It handles setting up the renderer process, if needed, with special
44// privileges available to extensions. It may have a view to be shown in the
[email protected]2d2f6cfc2011-05-06 21:09:3345// browser UI, or it may be hidden.
[email protected]22401dc2014-03-21 01:38:5746//
47// If you are adding code that only affects visible extension views (and not
48// invisible background pages) you should add it to ExtensionViewHost.
yozd61dfe192015-02-21 01:30:3749class ExtensionHost : public DeferredStartRenderHost,
50 public content::WebContentsDelegate,
[email protected]d8c660432011-12-22 20:51:2551 public content::WebContentsObserver,
[email protected]e95ad332009-08-03 19:44:2552 public ExtensionFunctionDispatcher::Delegate,
limasdfbbaa913d2015-03-02 23:52:3353 public ExtensionRegistryObserver {
[email protected]c64631652009-04-29 22:24:3154 public:
[email protected]3a1dc572012-07-31 22:25:1355 ExtensionHost(const Extension* extension,
[email protected]b6583592012-01-25 19:52:3356 content::SiteInstance* site_instance,
[email protected]cb2edf22013-04-01 20:25:2357 const GURL& url, ViewType host_type);
dcheng9168b2f2014-10-21 12:38:2458 ~ExtensionHost() override;
[email protected]c64631652009-04-29 22:24:3159
[email protected]3a1dc572012-07-31 22:25:1360 const Extension* extension() const { return extension_; }
[email protected]2d2f6cfc2011-05-06 21:09:3361 const std::string& extension_id() const { return extension_id_; }
[email protected]3a7d7d32012-01-05 17:44:0162 content::WebContents* host_contents() const { return host_contents_.get(); }
[email protected]eaabba22012-03-07 15:02:1163 content::RenderViewHost* render_view_host() const;
[email protected]f3b1a082011-11-18 00:34:3064 content::RenderProcessHost* render_process_host() const;
kalmanfd474fa2015-03-16 22:30:5765 bool has_loaded_once() const { return has_loaded_once_; }
rdevlin.croninb48a98e2015-05-01 00:00:2866 const GURL& initial_url() const { return initial_url_; }
[email protected]e95ad332009-08-03 19:44:2567 bool document_element_available() const {
68 return document_element_available_;
69 }
[email protected]01f829a2010-03-17 18:20:3170
[email protected]96e6a1032013-11-28 06:58:0371 content::BrowserContext* browser_context() { return browser_context_; }
[email protected]9fe42042013-10-29 21:13:3372
[email protected]cb2edf22013-04-01 20:25:2373 ViewType extension_host_type() const { return extension_host_type_; }
[email protected]952a68e2011-11-17 00:36:1074 const GURL& GetURL() const;
[email protected]f8e55e72010-02-25 06:13:4375
[email protected]7c6877d2009-06-19 13:56:2576 // Returns true if the render view is initialized and didn't crash.
77 bool IsRenderViewLive() const;
78
[email protected]844550002009-11-20 01:06:0079 // Prepares to initializes our RenderViewHost by creating its RenderView and
80 // navigating to this host's url. Uses host_view for the RenderViewHost's view
81 // (can be NULL). This happens delayed to avoid locking the UI.
[email protected]952a68e2011-11-17 00:36:1082 void CreateRenderViewSoon();
[email protected]bbc945542009-07-26 00:11:4283
rdevlin.cronin42efb7dd2015-02-11 17:50:5284 // Closes this host (results in [possibly asynchronous] deletion).
85 void Close();
86
chirantan79788f62015-02-02 23:57:2587 // Typical observer interface.
88 void AddObserver(ExtensionHostObserver* observer);
89 void RemoveObserver(ExtensionHostObserver* observer);
90
chirantan669993c2015-03-05 23:38:3391 // Called when an event is dispatched to the event page associated with this
92 // ExtensionHost.
93 void OnBackgroundEventDispatched(const std::string& event_name, int event_id);
chirantan79788f62015-02-02 23:57:2594
95 // Called by the ProcessManager when a network request is started by the
96 // extension corresponding to this ExtensionHost.
avic9cec102015-12-23 00:39:2697 void OnNetworkRequestStarted(uint64_t request_id);
chirantan79788f62015-02-02 23:57:2598
99 // Called by the ProcessManager when a previously started network request is
100 // finished.
avic9cec102015-12-23 00:39:26101 void OnNetworkRequestDone(uint64_t request_id);
chirantan79788f62015-02-02 23:57:25102
yozd61dfe192015-02-21 01:30:37103 // content::WebContentsObserver:
rdevlin.cronin6f42c2522015-06-19 18:58:51104 bool OnMessageReceived(const IPC::Message& message,
105 content::RenderFrameHost* host) override;
dcheng9168b2f2014-10-21 12:38:24106 void RenderViewCreated(content::RenderViewHost* render_view_host) override;
107 void RenderViewDeleted(content::RenderViewHost* render_view_host) override;
108 void RenderViewReady() override;
109 void RenderProcessGone(base::TerminationStatus status) override;
110 void DocumentAvailableInMainFrame() override;
fdegans6ce28f52015-03-19 12:52:22111 void DidStartLoading() override;
112 void DidStopLoading() override;
[email protected]952a68e2011-11-17 00:36:10113
yozd61dfe192015-02-21 01:30:37114 // content::WebContentsDelegate:
mathiash72a5e462014-11-19 08:18:50115 content::JavaScriptDialogManager* GetJavaScriptDialogManager(
116 content::WebContents* source) override;
dcheng9168b2f2014-10-21 12:38:24117 void AddNewContents(content::WebContents* source,
118 content::WebContents* new_contents,
119 WindowOpenDisposition disposition,
bokan107a47f2015-02-03 23:23:39120 const gfx::Rect& initial_rect,
dcheng9168b2f2014-10-21 12:38:24121 bool user_gesture,
122 bool* was_blocked) override;
123 void CloseContents(content::WebContents* contents) override;
124 void RequestMediaAccessPermission(
[email protected]0b9383a2012-10-26 00:58:16125 content::WebContents* web_contents,
[email protected]33662e52013-01-07 21:31:09126 const content::MediaStreamRequest& request,
mostynb0eac4e1b2014-10-03 16:32:19127 const content::MediaResponseCallback& callback) override;
dcheng9168b2f2014-10-21 12:38:24128 bool CheckMediaAccessPermission(content::WebContents* web_contents,
129 const GURL& security_origin,
130 content::MediaStreamType type) override;
131 bool IsNeverVisible(content::WebContents* web_contents) override;
[email protected]c64631652009-04-29 22:24:31132
limasdfbbaa913d2015-03-02 23:52:33133 // ExtensionRegistryObserver:
rockot494f0072015-07-29 17:58:07134 void OnExtensionReady(content::BrowserContext* browser_context,
135 const Extension* extension) override;
limasdfbbaa913d2015-03-02 23:52:33136 void OnExtensionUnloaded(content::BrowserContext* browser_context,
137 const Extension* extension,
138 UnloadedExtensionInfo::Reason reason) override;
[email protected]e95ad332009-08-03 19:44:25139
[email protected]45a73d52013-11-26 00:10:55140 protected:
kalmanfd474fa2015-03-16 22:30:57141 // Called each time this ExtensionHost completes a load finishes loading,
142 // before any stop-loading notifications or observer methods are called.
143 virtual void OnDidStopFirstLoad();
[email protected]45a73d52013-11-26 00:10:55144
[email protected]91abb922013-12-03 18:39:56145 // Navigates to the initial page.
146 virtual void LoadInitialURL();
147
[email protected]45a73d52013-11-26 00:10:55148 // Returns true if we're hosting a background page.
149 virtual bool IsBackgroundPage() const;
150
[email protected]c64631652009-04-29 22:24:31151 private:
yozd61dfe192015-02-21 01:30:37152 // DeferredStartRenderHost:
153 void CreateRenderViewNow() override;
kalmand49594b52015-02-27 17:27:16154 void AddDeferredStartRenderHostObserver(
155 DeferredStartRenderHostObserver* observer) override;
156 void RemoveDeferredStartRenderHostObserver(
157 DeferredStartRenderHostObserver* observer) override;
yozd61dfe192015-02-21 01:30:37158
[email protected]34f128d2011-01-25 19:07:44159 // Message handlers.
chirantan669993c2015-03-05 23:38:33160 void OnEventAck(int event_id);
[email protected]7042b682012-04-19 22:57:51161 void OnIncrementLazyKeepaliveCount();
162 void OnDecrementLazyKeepaliveCount();
[email protected]34f128d2011-01-25 19:07:44163
kalmanfd474fa2015-03-16 22:30:57164 // Records UMA for load events.
165 void RecordStopLoadingUMA();
166
[email protected]6c0f179f2014-03-19 11:04:41167 // Delegate for functionality that cannot exist in the extensions module.
dchengf5d241082016-04-21 03:43:11168 std::unique_ptr<ExtensionHostDelegate> delegate_;
[email protected]6c0f179f2014-03-19 11:04:41169
[email protected]c64631652009-04-29 22:24:31170 // The extension that we're hosting in this view.
[email protected]3a1dc572012-07-31 22:25:13171 const Extension* extension_;
[email protected]c64631652009-04-29 22:24:31172
[email protected]2d2f6cfc2011-05-06 21:09:33173 // Id of extension that we're hosting in this view.
174 const std::string extension_id_;
175
[email protected]96e6a1032013-11-28 06:58:03176 // The browser context that this host is tied to.
177 content::BrowserContext* browser_context_;
[email protected]8a17bd52009-06-06 08:19:49178
[email protected]c64631652009-04-29 22:24:31179 // The host for our HTML content.
dchengf5d241082016-04-21 03:43:11180 std::unique_ptr<content::WebContents> host_contents_;
[email protected]c64631652009-04-29 22:24:31181
[email protected]4f4d42a2011-12-02 02:42:49182 // A weak pointer to the current or pending RenderViewHost. We don't access
183 // this through the host_contents because we want to deal with the pending
184 // host, so we can send messages to it before it finishes loading.
[email protected]eaabba22012-03-07 15:02:11185 content::RenderViewHost* render_view_host_;
[email protected]4f4d42a2011-12-02 02:42:49186
rockot494f0072015-07-29 17:58:07187 // Whether CreateRenderViewNow was called before the extension was ready.
188 bool is_render_view_creation_pending_;
189
kalmanfd474fa2015-03-16 22:30:57190 // Whether the ExtensionHost has finished loading some content at least once.
191 // There may be subsequent loads - such as reloads and navigations - and this
192 // will not affect its value (it will remain true).
193 bool has_loaded_once_;
[email protected]c64631652009-04-29 22:24:31194
[email protected]e95ad332009-08-03 19:44:25195 // True if the main frame has finished parsing.
196 bool document_element_available_;
197
[email protected]952a68e2011-11-17 00:36:10198 // The original URL of the page being hosted.
199 GURL initial_url_;
[email protected]e916901c2009-05-07 00:14:31200
chirantan79788f62015-02-02 23:57:25201 // Messages sent out to the renderer that have not been acknowledged yet.
202 std::set<int> unacked_messages_;
203
[email protected]720ad1312012-02-27 23:07:36204 // The type of view being hosted.
[email protected]cb2edf22013-04-01 20:25:23205 ViewType extension_host_type_;
[email protected]7b291f92009-08-14 05:43:53206
kalman0f101ac2015-05-06 01:23:17207 // Measures how long since the ExtensionHost object was created. This can be
208 // used to measure the responsiveness of UI. For example, it's important to
209 // keep this as low as possible for popups. Contrast this to |load_start_|,
210 // for which a low value does not necessarily mean a responsive UI, as
211 // ExtensionHosts may sit in an ExtensionHostQueue for a long time.
212 base::ElapsedTimer create_start_;
213
214 // Measures how long since the initial URL started loading. This timer is
215 // started only once the ExtensionHost has exited the ExtensionHostQueue.
dchengf5d241082016-04-21 03:43:11216 std::unique_ptr<base::ElapsedTimer> load_start_;
[email protected]cc2c3432009-11-06 17:24:36217
brettw236d3172015-06-03 16:31:43218 base::ObserverList<ExtensionHostObserver> observer_list_;
219 base::ObserverList<DeferredStartRenderHostObserver>
kalmand49594b52015-02-27 17:27:16220 deferred_start_render_host_observer_list_;
chirantan79788f62015-02-02 23:57:25221
[email protected]c64631652009-04-29 22:24:31222 DISALLOW_COPY_AND_ASSIGN(ExtensionHost);
223};
224
[email protected]3a1dc572012-07-31 22:25:13225} // namespace extensions
226
[email protected]22401dc2014-03-21 01:38:57227#endif // EXTENSIONS_BROWSER_EXTENSION_HOST_H_