blob: ede3883a37ce29a2c7fae7f7e36d3b8ed839d142 [file] [log] [blame]
[email protected]8809f1442012-01-20 21:21:471// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]36fb2c7c2011-04-04 15:49:082// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]a6394ae2012-07-16 20:58:435#ifndef CHROME_BROWSER_EXTENSIONS_TAB_HELPER_H_
6#define CHROME_BROWSER_EXTENSIONS_TAB_HELPER_H_
[email protected]36fb2c7c2011-04-04 15:49:087
dchengc963c7142016-04-08 03:55:228#include <memory>
[email protected]a340bb42014-01-09 07:33:209#include <set>
[email protected]4b64d712013-01-17 17:53:1710#include <string>
[email protected]a714e462013-01-26 06:33:1011
avia2f4804a2015-12-24 23:11:1312#include "base/macros.h"
[email protected]28a69d32012-05-30 07:58:1813#include "base/memory/ref_counted.h"
[email protected]82a43732011-10-07 16:09:1114#include "base/memory/weak_ptr.h"
[email protected]a83b8402012-05-17 06:56:4415#include "base/observer_list.h"
rdevlin.cronin1f047f7b2016-06-06 18:30:1816#include "base/scoped_observer.h"
[email protected]78ce3022012-09-24 01:48:4817#include "chrome/browser/extensions/active_tab_permission_granter.h"
rdevlin.cronin092c6772014-11-20 23:52:4018#include "chrome/browser/extensions/extension_reenabler.h"
cm.sanchi2b601c32017-12-18 10:49:2819#include "chrome/common/chrome_render_frame.mojom.h"
catmullingsba539102017-05-26 19:45:1020#include "chrome/common/extensions/mojom/inline_install.mojom.h"
[email protected]ced522c2014-07-23 20:23:5921#include "chrome/common/extensions/webstore_install_result.h"
[email protected]93f50462013-05-10 04:40:4022#include "chrome/common/web_application_info.h"
catmullingsba539102017-05-26 19:45:1023#include "content/public/browser/web_contents_binding_set.h"
[email protected]d8c660432011-12-22 20:51:2524#include "content/public/browser/web_contents_observer.h"
[email protected]46b3c982012-10-09 18:38:3025#include "content/public/browser/web_contents_user_data.h"
[email protected]0b9de032014-03-15 05:47:0126#include "extensions/browser/extension_function_dispatcher.h"
rdevlin.cronin1f047f7b2016-06-06 18:30:1827#include "extensions/browser/extension_registry_observer.h"
[email protected]16a4206f2014-08-15 09:44:4328#include "extensions/browser/script_execution_observer.h"
29#include "extensions/browser/script_executor.h"
rdevlin.cronind8076cd62016-07-08 23:05:5830#include "extensions/common/extension_id.h"
[email protected]88b50b62013-09-01 23:05:0631#include "extensions/common/stack_frame.h"
[email protected]36fb2c7c2011-04-04 15:49:0832#include "third_party/skia/include/core/SkBitmap.h"
33
lukasza53fe8fd82017-06-20 23:38:3434namespace content {
35class RenderFrameHost;
36}
37
[email protected]75b91fd2013-02-12 22:14:2538namespace gfx {
39class Image;
40}
41
[email protected]a83b8402012-05-17 06:56:4442namespace extensions {
rdevlin.cronin8408b4f92016-03-15 19:14:1443class ExtensionActionRunner;
[email protected]33c87892014-03-25 06:28:1544class BookmarkAppHelper;
[email protected]1c321ee52012-05-21 03:02:3445class Extension;
[email protected]3d6d676522013-10-14 20:44:5546class WebstoreInlineInstallerFactory;
[email protected]a83b8402012-05-17 06:56:4447
[email protected]74e51402011-04-06 14:17:5948// Per-tab extension helper. Also handles non-extension apps.
[email protected]a6394ae2012-07-16 20:58:4349class TabHelper : public content::WebContentsObserver,
rdevlin.cronin1f047f7b2016-06-06 18:30:1850 public ExtensionFunctionDispatcher::Delegate,
51 public ExtensionRegistryObserver,
catmullingsba539102017-05-26 19:45:1052 public content::WebContentsUserData<TabHelper>,
53 public mojom::InlineInstaller {
[email protected]36fb2c7c2011-04-04 15:49:0854 public:
dchengae36a4a2014-10-21 12:36:3655 ~TabHelper() override;
[email protected]36fb2c7c2011-04-04 15:49:0856
[email protected]488e3952013-11-18 05:29:1457 void CreateHostedAppFromWebContents();
[email protected]92086542014-04-08 08:45:2958 bool CanCreateBookmarkApp() const;
[email protected]1739e57d2011-11-30 21:18:2559
[email protected]16a4206f2014-08-15 09:44:4360 // ScriptExecutionObserver::Delegate
61 virtual void AddScriptExecutionObserver(ScriptExecutionObserver* observer);
62 virtual void RemoveScriptExecutionObserver(ScriptExecutionObserver* observer);
63
[email protected]36fb2c7c2011-04-04 15:49:0864 // Sets the extension denoting this as an app. If |extension| is non-null this
[email protected]0932b30c2012-04-17 13:25:1065 // tab becomes an app-tab. WebContents does not listen for unload events for
66 // the extension. It's up to consumers of WebContents to do that.
[email protected]36fb2c7c2011-04-04 15:49:0867 //
68 // NOTE: this should only be manipulated before the tab is added to a browser.
69 // TODO(sky): resolve if this is the right way to identify an app tab. If it
70 // is, than this should be passed in the constructor.
[email protected]a6394ae2012-07-16 20:58:4371 void SetExtensionApp(const Extension* extension);
[email protected]36fb2c7c2011-04-04 15:49:0872
73 // Convenience for setting the app extension by id. This does nothing if
74 // |extension_app_id| is empty, or an extension can't be found given the
75 // specified id.
rdevlin.cronind8076cd62016-07-08 23:05:5876 void SetExtensionAppById(const ExtensionId& extension_app_id);
[email protected]36fb2c7c2011-04-04 15:49:0877
[email protected]a6394ae2012-07-16 20:58:4378 const Extension* extension_app() const { return extension_app_; }
[email protected]36fb2c7c2011-04-04 15:49:0879 bool is_app() const { return extension_app_ != NULL; }
[email protected]553602e12011-04-05 17:01:1880 const WebApplicationInfo& web_app_info() const {
81 return web_app_info_;
82 }
[email protected]36fb2c7c2011-04-04 15:49:0883
[email protected]0932b30c2012-04-17 13:25:1084 // If an app extension has been explicitly set for this WebContents its icon
[email protected]36fb2c7c2011-04-04 15:49:0885 // is returned.
86 //
87 // NOTE: the returned icon is larger than 16x16 (its size is
[email protected]1d5e58b2013-01-31 08:41:4088 // extension_misc::EXTENSION_ICON_SMALLISH).
[email protected]36fb2c7c2011-04-04 15:49:0889 SkBitmap* GetExtensionAppIcon();
90
[email protected]a6394ae2012-07-16 20:58:4391 ScriptExecutor* script_executor() {
[email protected]09ae70d42012-11-07 00:42:0992 return script_executor_.get();
[email protected]af78a802012-07-10 23:47:0293 }
[email protected]a83b8402012-05-17 06:56:4494
rdevlin.cronin8408b4f92016-03-15 19:14:1495 ExtensionActionRunner* extension_action_runner() {
96 return extension_action_runner_.get();
rdevlin.cronin91f162a12014-09-03 16:48:4097 }
98
[email protected]78ce3022012-09-24 01:48:4899 ActiveTabPermissionGranter* active_tab_permission_granter() {
100 return active_tab_permission_granter_.get();
[email protected]fc5e65d6b2012-06-13 00:22:57101 }
102
[email protected]3d6d676522013-10-14 20:44:55103 // Sets the factory used to create inline webstore item installers.
104 // Used for testing. Takes ownership of the factory instance.
105 void SetWebstoreInlineInstallerFactoryForTests(
106 WebstoreInlineInstallerFactory* factory);
107
[email protected]36fb2c7c2011-04-04 15:49:08108 private:
rdevlin.cronind30a8bd2016-06-30 16:02:29109 class InlineInstallObserver;
110
wittman2b0e40652015-06-10 00:53:03111 // Utility function to invoke member functions on all relevant
112 // ContentRulesRegistries.
113 template <class Func>
114 void InvokeForContentRulesRegistries(const Func& func);
115
[email protected]fd14a442014-07-02 20:40:05116 // Different types of action when web app info is available.
Alan Cutter4b606412018-02-08 23:32:20117 // OnDidGetWebApplicationInfo uses this to dispatch calls.
[email protected]fd14a442014-07-02 20:40:05118 enum WebAppAction {
119 NONE, // No action at all.
[email protected]fd14a442014-07-02 20:40:05120 CREATE_HOSTED_APP, // Create and install a hosted app.
[email protected]fd14a442014-07-02 20:40:05121 };
122
[email protected]a78f03c2012-09-15 05:08:19123 explicit TabHelper(content::WebContents* web_contents);
catmullingsba539102017-05-26 19:45:10124
[email protected]46b3c982012-10-09 18:38:30125 friend class content::WebContentsUserData<TabHelper>;
[email protected]a78f03c2012-09-15 05:08:19126
[email protected]33c87892014-03-25 06:28:15127 // Displays UI for completion of creating a bookmark hosted app.
catmullingsba539102017-05-26 19:45:10128 void FinishCreateBookmarkApp(const Extension* extension,
[email protected]33c87892014-03-25 06:28:15129 const WebApplicationInfo& web_app_info);
[email protected]898697902013-12-18 03:25:46130
[email protected]d8c660432011-12-22 20:51:25131 // content::WebContentsObserver overrides.
rdevlin.croninb67a34772015-06-04 16:32:38132 void RenderFrameCreated(content::RenderFrameHost* host) override;
jamf1c7f0c2017-02-02 01:04:37133 void DidFinishNavigation(
134 content::NavigationHandle* navigation_handle) override;
dchengae36a4a2014-10-21 12:36:36135 bool OnMessageReceived(const IPC::Message& message,
lukasza53fe8fd82017-06-20 23:38:34136 content::RenderFrameHost* sender) override;
dchengae36a4a2014-10-21 12:36:36137 void DidCloneToNewWebContents(
[email protected]7381d9f2012-09-12 20:26:22138 content::WebContents* old_web_contents,
mostynba15bee12014-10-04 00:40:32139 content::WebContents* new_web_contents) override;
[email protected]553602e12011-04-05 17:01:18140
catmullingsba539102017-05-26 19:45:10141 // ExtensionFunctionDispatcher::Delegate overrides.
142 WindowController* GetExtensionWindowController() const override;
dchengae36a4a2014-10-21 12:36:36143 content::WebContents* GetAssociatedWebContents() const override;
[email protected]c5dbef02011-05-13 05:06:09144
rdevlin.cronin1f047f7b2016-06-06 18:30:18145 // ExtensionRegistryObserver:
146 void OnExtensionUnloaded(content::BrowserContext* browser_context,
147 const Extension* extension,
limasdf0deef2042017-05-03 19:17:17148 UnloadedExtensionReason reason) override;
rdevlin.cronin1f047f7b2016-06-06 18:30:18149
catmullingsba539102017-05-26 19:45:10150 // mojom::InlineInstall:
151 void DoInlineInstall(
152 const std::string& webstore_item_id,
153 int listeners_mask,
154 mojom::InlineInstallProgressListenerPtr install_progress_listener,
155 DoInlineInstallCallback callback) override;
156
[email protected]553602e12011-04-05 17:01:18157 // Message handlers.
cm.sanchi2b601c32017-12-18 10:49:28158 void OnDidGetWebApplicationInfo(
159 chrome::mojom::ChromeRenderFrameAssociatedPtr chrome_render_frame,
160 const WebApplicationInfo& info);
rdevlin.cronin7df58052015-07-10 20:30:20161 void OnGetAppInstallState(content::RenderFrameHost* host,
162 const GURL& requestor_url,
[email protected]f2fe87c2012-04-24 17:53:49163 int return_route_id,
164 int callback_id);
[email protected]d5b528c2012-09-27 16:30:20165 void OnContentScriptsExecuting(
rdevlin.cronin7df58052015-07-10 20:30:20166 content::RenderFrameHost* host,
[email protected]09ae70d42012-11-07 00:42:09167 const ScriptExecutionObserver::ExecutingScriptsMap& extension_ids,
[email protected]d5b528c2012-09-27 16:30:20168 const GURL& on_url);
[email protected]36fb2c7c2011-04-04 15:49:08169
170 // App extensions related methods:
171
[email protected]75b91fd2013-02-12 22:14:25172 // Resets app_icon_ and if |extension| is non-null uses ImageLoader to load
173 // the extension's image asynchronously.
[email protected]a6394ae2012-07-16 20:58:43174 void UpdateExtensionAppIcon(const Extension* extension);
[email protected]36fb2c7c2011-04-04 15:49:08175
rdevlin.cronind8076cd62016-07-08 23:05:58176 const Extension* GetExtension(const ExtensionId& extension_app_id);
[email protected]dd290d32012-03-06 02:47:51177
[email protected]7069ed82013-01-26 01:39:53178 void OnImageLoaded(const gfx::Image& image);
[email protected]8915f342011-08-29 22:14:37179
[email protected]734bcec2012-10-08 20:29:05180 // WebstoreStandaloneInstaller::Callback.
catmullingsba539102017-05-26 19:45:10181 void OnInlineInstallComplete(const ExtensionId& extension_id,
rdevlin.cronin092c6772014-11-20 23:52:40182 bool success,
183 const std::string& error,
184 webstore_install::Result result);
185
186 // ExtensionReenabler::Callback.
catmullingsba539102017-05-26 19:45:10187 void OnReenableComplete(const ExtensionId& extension_id,
rdevlin.cronin092c6772014-11-20 23:52:40188 ExtensionReenabler::ReenableResult result);
[email protected]36fb2c7c2011-04-04 15:49:08189
[email protected]619f86182012-07-03 21:30:18190 // Requests application info for the specified page. This is an asynchronous
Alan Cutter4b606412018-02-08 23:32:20191 // request. The delegate is notified by way of OnDidGetWebApplicationInfo when
[email protected]619f86182012-07-03 21:30:18192 // the data is available.
[email protected]fd14a442014-07-02 20:40:05193 void GetApplicationInfo(WebAppAction action);
[email protected]619f86182012-07-03 21:30:18194
rdevlin.croninb67a34772015-06-04 16:32:38195 // Sends our tab ID to |render_frame_host|.
196 void SetTabId(content::RenderFrameHost* render_frame_host);
[email protected]2fc1cad12013-05-21 00:41:39197
wittman2b0e40652015-06-10 00:53:03198 Profile* profile_;
[email protected]36fb2c7c2011-04-04 15:49:08199
[email protected]d5b528c2012-09-27 16:30:20200 // Our content script observers. Declare at top so that it will outlive all
201 // other members, since they might add themselves as observers.
brettwd195c952015-06-02 17:31:12202 base::ObserverList<ScriptExecutionObserver> script_execution_observers_;
[email protected]a83b8402012-05-17 06:56:44203
[email protected]36fb2c7c2011-04-04 15:49:08204 // If non-null this tab is an app tab and this is the extension the tab was
205 // created for.
[email protected]a6394ae2012-07-16 20:58:43206 const Extension* extension_app_;
[email protected]36fb2c7c2011-04-04 15:49:08207
[email protected]74e51402011-04-06 14:17:59208 // Icon for extension_app_ (if non-null) or a manually-set icon for
209 // non-extension apps.
[email protected]36fb2c7c2011-04-04 15:49:08210 SkBitmap extension_app_icon_;
211
[email protected]553602e12011-04-05 17:01:18212 // Cached web app info data.
213 WebApplicationInfo web_app_info_;
214
Alan Cutter4b606412018-02-08 23:32:20215 // Which deferred action to perform when OnDidGetWebApplicationInfo is
216 // notified from a WebContents.
[email protected]619f86182012-07-03 21:30:18217 WebAppAction pending_web_app_action_;
218
avi1a908722015-01-15 16:01:49219 // Which navigation entry was active when the GetApplicationInfo request was
220 // sent, for verification when the reply returns.
221 int last_committed_nav_entry_unique_id_;
[email protected]fd14a442014-07-02 20:40:05222
dchengc963c7142016-04-08 03:55:22223 std::unique_ptr<ScriptExecutor> script_executor_;
[email protected]af78a802012-07-10 23:47:02224
dchengc963c7142016-04-08 03:55:22225 std::unique_ptr<ExtensionActionRunner> extension_action_runner_;
rdevlin.cronin91f162a12014-09-03 16:48:40226
dchengc963c7142016-04-08 03:55:22227 std::unique_ptr<ActiveTabPermissionGranter> active_tab_permission_granter_;
[email protected]fc5e65d6b2012-06-13 00:22:57228
dchengc963c7142016-04-08 03:55:22229 std::unique_ptr<BookmarkAppHelper> bookmark_app_helper_;
[email protected]898697902013-12-18 03:25:46230
[email protected]3d6d676522013-10-14 20:44:55231 // Creates WebstoreInlineInstaller instances for inline install triggers.
dchengc963c7142016-04-08 03:55:22232 std::unique_ptr<WebstoreInlineInstallerFactory>
233 webstore_inline_installer_factory_;
[email protected]3d6d676522013-10-14 20:44:55234
rdevlin.cronin092c6772014-11-20 23:52:40235 // The reenable prompt for disabled extensions, if any.
dchengc963c7142016-04-08 03:55:22236 std::unique_ptr<ExtensionReenabler> extension_reenabler_;
rdevlin.cronin092c6772014-11-20 23:52:40237
rdevlin.cronin1f047f7b2016-06-06 18:30:18238 ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
239 registry_observer_;
240
rdevlin.cronind8076cd62016-07-08 23:05:58241 // Map of InlineInstallObservers for inline installations that have progress
242 // listeners.
243 std::map<ExtensionId, std::unique_ptr<InlineInstallObserver>>
rdevlin.cronind30a8bd2016-06-30 16:02:29244 install_observers_;
245
catmullingsba539102017-05-26 19:45:10246 // Map of function callbacks that are invoked when the inline installation for
247 // a particular extension (hence ExtensionId) completes.
248 std::map<ExtensionId, DoInlineInstallCallback> install_callbacks_;
249
250 content::WebContentsFrameBindingSet<mojom::InlineInstaller> bindings_;
251
252 std::map<ExtensionId, mojom::InlineInstallProgressListenerPtr>
253 inline_install_progress_listeners_;
rdevlin.cronind30a8bd2016-06-30 16:02:29254
mohan.reddy63d63002014-09-16 04:13:56255 // Vend weak pointers that can be invalidated to stop in-progress loads.
256 base::WeakPtrFactory<TabHelper> image_loader_ptr_factory_;
257
rdevlin.cronin092c6772014-11-20 23:52:40258 // Generic weak ptr factory for posting callbacks.
259 base::WeakPtrFactory<TabHelper> weak_ptr_factory_;
260
[email protected]a6394ae2012-07-16 20:58:43261 DISALLOW_COPY_AND_ASSIGN(TabHelper);
[email protected]36fb2c7c2011-04-04 15:49:08262};
263
[email protected]a6394ae2012-07-16 20:58:43264} // namespace extensions
265
266#endif // CHROME_BROWSER_EXTENSIONS_TAB_HELPER_H_