blob: 9972002c03aa507adcf8f1706553e4c5ec287017 [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"
cm.sanchi2b601c32017-12-18 10:49:2818#include "chrome/common/chrome_render_frame.mojom.h"
[email protected]ced522c2014-07-23 20:23:5919#include "chrome/common/extensions/webstore_install_result.h"
[email protected]93f50462013-05-10 04:40:4020#include "chrome/common/web_application_info.h"
catmullingsba539102017-05-26 19:45:1021#include "content/public/browser/web_contents_binding_set.h"
[email protected]d8c660432011-12-22 20:51:2522#include "content/public/browser/web_contents_observer.h"
[email protected]46b3c982012-10-09 18:38:3023#include "content/public/browser/web_contents_user_data.h"
[email protected]0b9de032014-03-15 05:47:0124#include "extensions/browser/extension_function_dispatcher.h"
rdevlin.cronin1f047f7b2016-06-06 18:30:1825#include "extensions/browser/extension_registry_observer.h"
[email protected]16a4206f2014-08-15 09:44:4326#include "extensions/browser/script_executor.h"
rdevlin.cronind8076cd62016-07-08 23:05:5827#include "extensions/common/extension_id.h"
[email protected]88b50b62013-09-01 23:05:0628#include "extensions/common/stack_frame.h"
[email protected]36fb2c7c2011-04-04 15:49:0829#include "third_party/skia/include/core/SkBitmap.h"
30
lukasza53fe8fd82017-06-20 23:38:3431namespace content {
32class RenderFrameHost;
33}
34
[email protected]75b91fd2013-02-12 22:14:2535namespace gfx {
36class Image;
37}
38
[email protected]a83b8402012-05-17 06:56:4439namespace extensions {
rdevlin.cronin8408b4f92016-03-15 19:14:1440class ExtensionActionRunner;
[email protected]33c87892014-03-25 06:28:1541class BookmarkAppHelper;
[email protected]1c321ee52012-05-21 03:02:3442class Extension;
[email protected]a83b8402012-05-17 06:56:4443
[email protected]74e51402011-04-06 14:17:5944// Per-tab extension helper. Also handles non-extension apps.
[email protected]a6394ae2012-07-16 20:58:4345class TabHelper : public content::WebContentsObserver,
rdevlin.cronin1f047f7b2016-06-06 18:30:1846 public ExtensionFunctionDispatcher::Delegate,
47 public ExtensionRegistryObserver,
Benjamin Ackermanc4fb02302018-10-03 19:55:4148 public content::WebContentsUserData<TabHelper> {
[email protected]36fb2c7c2011-04-04 15:49:0849 public:
dchengae36a4a2014-10-21 12:36:3650 ~TabHelper() override;
[email protected]36fb2c7c2011-04-04 15:49:0851
Alan Cutter81ac726682018-09-25 00:18:3652 void CreateHostedAppFromWebContents(bool shortcut_app_requested);
[email protected]92086542014-04-08 08:45:2953 bool CanCreateBookmarkApp() const;
[email protected]1739e57d2011-11-30 21:18:2554
[email protected]36fb2c7c2011-04-04 15:49:0855 // Sets the extension denoting this as an app. If |extension| is non-null this
[email protected]0932b30c2012-04-17 13:25:1056 // tab becomes an app-tab. WebContents does not listen for unload events for
57 // the extension. It's up to consumers of WebContents to do that.
[email protected]36fb2c7c2011-04-04 15:49:0858 //
59 // NOTE: this should only be manipulated before the tab is added to a browser.
60 // TODO(sky): resolve if this is the right way to identify an app tab. If it
61 // is, than this should be passed in the constructor.
[email protected]a6394ae2012-07-16 20:58:4362 void SetExtensionApp(const Extension* extension);
[email protected]36fb2c7c2011-04-04 15:49:0863
64 // Convenience for setting the app extension by id. This does nothing if
65 // |extension_app_id| is empty, or an extension can't be found given the
66 // specified id.
rdevlin.cronind8076cd62016-07-08 23:05:5867 void SetExtensionAppById(const ExtensionId& extension_app_id);
[email protected]36fb2c7c2011-04-04 15:49:0868
Alexey Baskakov21174782018-09-19 02:46:3969 // Returns true if an app extension has been set.
70 bool is_app() const { return extension_app_ != nullptr; }
71
72 // Return ExtensionId for extension app.
73 // If an app extension has not been set, returns empty id.
74 ExtensionId GetAppId() const;
[email protected]36fb2c7c2011-04-04 15:49:0875
[email protected]0932b30c2012-04-17 13:25:1076 // If an app extension has been explicitly set for this WebContents its icon
[email protected]36fb2c7c2011-04-04 15:49:0877 // is returned.
78 //
79 // NOTE: the returned icon is larger than 16x16 (its size is
[email protected]1d5e58b2013-01-31 08:41:4080 // extension_misc::EXTENSION_ICON_SMALLISH).
[email protected]36fb2c7c2011-04-04 15:49:0881 SkBitmap* GetExtensionAppIcon();
82
[email protected]a6394ae2012-07-16 20:58:4383 ScriptExecutor* script_executor() {
[email protected]09ae70d42012-11-07 00:42:0984 return script_executor_.get();
[email protected]af78a802012-07-10 23:47:0285 }
[email protected]a83b8402012-05-17 06:56:4486
rdevlin.cronin8408b4f92016-03-15 19:14:1487 ExtensionActionRunner* extension_action_runner() {
88 return extension_action_runner_.get();
rdevlin.cronin91f162a12014-09-03 16:48:4089 }
90
[email protected]78ce3022012-09-24 01:48:4891 ActiveTabPermissionGranter* active_tab_permission_granter() {
92 return active_tab_permission_granter_.get();
[email protected]fc5e65d6b2012-06-13 00:22:5793 }
94
[email protected]36fb2c7c2011-04-04 15:49:0895 private:
wittman2b0e40652015-06-10 00:53:0396 // Utility function to invoke member functions on all relevant
97 // ContentRulesRegistries.
98 template <class Func>
99 void InvokeForContentRulesRegistries(const Func& func);
100
[email protected]fd14a442014-07-02 20:40:05101 // Different types of action when web app info is available.
Alan Cutter4b606412018-02-08 23:32:20102 // OnDidGetWebApplicationInfo uses this to dispatch calls.
[email protected]fd14a442014-07-02 20:40:05103 enum WebAppAction {
104 NONE, // No action at all.
[email protected]fd14a442014-07-02 20:40:05105 CREATE_HOSTED_APP, // Create and install a hosted app.
[email protected]fd14a442014-07-02 20:40:05106 };
107
[email protected]a78f03c2012-09-15 05:08:19108 explicit TabHelper(content::WebContents* web_contents);
catmullingsba539102017-05-26 19:45:10109
[email protected]46b3c982012-10-09 18:38:30110 friend class content::WebContentsUserData<TabHelper>;
[email protected]a78f03c2012-09-15 05:08:19111
[email protected]33c87892014-03-25 06:28:15112 // Displays UI for completion of creating a bookmark hosted app.
catmullingsba539102017-05-26 19:45:10113 void FinishCreateBookmarkApp(const Extension* extension,
[email protected]33c87892014-03-25 06:28:15114 const WebApplicationInfo& web_app_info);
[email protected]898697902013-12-18 03:25:46115
[email protected]d8c660432011-12-22 20:51:25116 // content::WebContentsObserver overrides.
rdevlin.croninb67a34772015-06-04 16:32:38117 void RenderFrameCreated(content::RenderFrameHost* host) override;
jamf1c7f0c2017-02-02 01:04:37118 void DidFinishNavigation(
119 content::NavigationHandle* navigation_handle) override;
dchengae36a4a2014-10-21 12:36:36120 bool OnMessageReceived(const IPC::Message& message,
lukasza53fe8fd82017-06-20 23:38:34121 content::RenderFrameHost* sender) override;
dchengae36a4a2014-10-21 12:36:36122 void DidCloneToNewWebContents(
[email protected]7381d9f2012-09-12 20:26:22123 content::WebContents* old_web_contents,
mostynba15bee12014-10-04 00:40:32124 content::WebContents* new_web_contents) override;
[email protected]553602e12011-04-05 17:01:18125
catmullingsba539102017-05-26 19:45:10126 // ExtensionFunctionDispatcher::Delegate overrides.
127 WindowController* GetExtensionWindowController() const override;
dchengae36a4a2014-10-21 12:36:36128 content::WebContents* GetAssociatedWebContents() const override;
[email protected]c5dbef02011-05-13 05:06:09129
rdevlin.cronin1f047f7b2016-06-06 18:30:18130 // ExtensionRegistryObserver:
131 void OnExtensionUnloaded(content::BrowserContext* browser_context,
132 const Extension* extension,
limasdf0deef2042017-05-03 19:17:17133 UnloadedExtensionReason reason) override;
rdevlin.cronin1f047f7b2016-06-06 18:30:18134
[email protected]553602e12011-04-05 17:01:18135 // Message handlers.
cm.sanchi2b601c32017-12-18 10:49:28136 void OnDidGetWebApplicationInfo(
137 chrome::mojom::ChromeRenderFrameAssociatedPtr chrome_render_frame,
Alan Cutter81ac726682018-09-25 00:18:36138 bool shortcut_app_requested,
cm.sanchi2b601c32017-12-18 10:49:28139 const WebApplicationInfo& info);
rdevlin.cronin7df58052015-07-10 20:30:20140 void OnGetAppInstallState(content::RenderFrameHost* host,
141 const GURL& requestor_url,
[email protected]f2fe87c2012-04-24 17:53:49142 int return_route_id,
143 int callback_id);
Trent Apted8f733b92018-10-04 00:54:45144 void OnContentScriptsExecuting(content::RenderFrameHost* host,
145 const ExecutingScriptsMap& extension_ids,
146 const GURL& on_url);
[email protected]36fb2c7c2011-04-04 15:49:08147
148 // App extensions related methods:
149
[email protected]75b91fd2013-02-12 22:14:25150 // Resets app_icon_ and if |extension| is non-null uses ImageLoader to load
151 // the extension's image asynchronously.
[email protected]a6394ae2012-07-16 20:58:43152 void UpdateExtensionAppIcon(const Extension* extension);
[email protected]36fb2c7c2011-04-04 15:49:08153
rdevlin.cronind8076cd62016-07-08 23:05:58154 const Extension* GetExtension(const ExtensionId& extension_app_id);
[email protected]dd290d32012-03-06 02:47:51155
[email protected]7069ed82013-01-26 01:39:53156 void OnImageLoaded(const gfx::Image& image);
[email protected]8915f342011-08-29 22:14:37157
[email protected]619f86182012-07-03 21:30:18158 // Requests application info for the specified page. This is an asynchronous
Alan Cutter4b606412018-02-08 23:32:20159 // request. The delegate is notified by way of OnDidGetWebApplicationInfo when
[email protected]619f86182012-07-03 21:30:18160 // the data is available.
Alan Cutter81ac726682018-09-25 00:18:36161 void GetApplicationInfo(WebAppAction action, bool shortcut_app_requested);
[email protected]619f86182012-07-03 21:30:18162
rdevlin.croninb67a34772015-06-04 16:32:38163 // Sends our tab ID to |render_frame_host|.
164 void SetTabId(content::RenderFrameHost* render_frame_host);
[email protected]2fc1cad12013-05-21 00:41:39165
wittman2b0e40652015-06-10 00:53:03166 Profile* profile_;
[email protected]36fb2c7c2011-04-04 15:49:08167
[email protected]36fb2c7c2011-04-04 15:49:08168 // If non-null this tab is an app tab and this is the extension the tab was
169 // created for.
[email protected]a6394ae2012-07-16 20:58:43170 const Extension* extension_app_;
[email protected]36fb2c7c2011-04-04 15:49:08171
[email protected]74e51402011-04-06 14:17:59172 // Icon for extension_app_ (if non-null) or a manually-set icon for
173 // non-extension apps.
[email protected]36fb2c7c2011-04-04 15:49:08174 SkBitmap extension_app_icon_;
175
[email protected]553602e12011-04-05 17:01:18176 // Cached web app info data.
177 WebApplicationInfo web_app_info_;
178
Alan Cutter4b606412018-02-08 23:32:20179 // Which deferred action to perform when OnDidGetWebApplicationInfo is
180 // notified from a WebContents.
[email protected]619f86182012-07-03 21:30:18181 WebAppAction pending_web_app_action_;
182
avi1a908722015-01-15 16:01:49183 // Which navigation entry was active when the GetApplicationInfo request was
184 // sent, for verification when the reply returns.
185 int last_committed_nav_entry_unique_id_;
[email protected]fd14a442014-07-02 20:40:05186
dchengc963c7142016-04-08 03:55:22187 std::unique_ptr<ScriptExecutor> script_executor_;
[email protected]af78a802012-07-10 23:47:02188
dchengc963c7142016-04-08 03:55:22189 std::unique_ptr<ExtensionActionRunner> extension_action_runner_;
rdevlin.cronin91f162a12014-09-03 16:48:40190
dchengc963c7142016-04-08 03:55:22191 std::unique_ptr<ActiveTabPermissionGranter> active_tab_permission_granter_;
[email protected]fc5e65d6b2012-06-13 00:22:57192
dchengc963c7142016-04-08 03:55:22193 std::unique_ptr<BookmarkAppHelper> bookmark_app_helper_;
[email protected]898697902013-12-18 03:25:46194
rdevlin.cronin1f047f7b2016-06-06 18:30:18195 ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
196 registry_observer_;
197
mohan.reddy63d63002014-09-16 04:13:56198 // Vend weak pointers that can be invalidated to stop in-progress loads.
199 base::WeakPtrFactory<TabHelper> image_loader_ptr_factory_;
200
rdevlin.cronin092c6772014-11-20 23:52:40201 // Generic weak ptr factory for posting callbacks.
202 base::WeakPtrFactory<TabHelper> weak_ptr_factory_;
203
[email protected]a6394ae2012-07-16 20:58:43204 DISALLOW_COPY_AND_ASSIGN(TabHelper);
[email protected]36fb2c7c2011-04-04 15:49:08205};
206
[email protected]a6394ae2012-07-16 20:58:43207} // namespace extensions
208
209#endif // CHROME_BROWSER_EXTENSIONS_TAB_HELPER_H_