blob: fc1dea95efbda216d170238984790fb7d7d0db5e [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
Alexey Baskakov094762b72018-10-23 07:50:5812#include "base/callback_forward.h"
avia2f4804a2015-12-24 23:11:1313#include "base/macros.h"
[email protected]28a69d32012-05-30 07:58:1814#include "base/memory/ref_counted.h"
[email protected]82a43732011-10-07 16:09:1115#include "base/memory/weak_ptr.h"
[email protected]a83b8402012-05-17 06:56:4416#include "base/observer_list.h"
rdevlin.cronin1f047f7b2016-06-06 18:30:1817#include "base/scoped_observer.h"
[email protected]78ce3022012-09-24 01:48:4818#include "chrome/browser/extensions/active_tab_permission_granter.h"
[email protected]ced522c2014-07-23 20:23:5919#include "chrome/common/extensions/webstore_install_result.h"
catmullingsba539102017-05-26 19:45:1020#include "content/public/browser/web_contents_binding_set.h"
[email protected]d8c660432011-12-22 20:51:2521#include "content/public/browser/web_contents_observer.h"
[email protected]46b3c982012-10-09 18:38:3022#include "content/public/browser/web_contents_user_data.h"
[email protected]0b9de032014-03-15 05:47:0123#include "extensions/browser/extension_function_dispatcher.h"
Evan Stade75872a62019-09-06 21:17:3824#include "extensions/browser/extension_registry.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]1c321ee52012-05-21 03:02:3441class Extension;
[email protected]a83b8402012-05-17 06:56:4442
[email protected]74e51402011-04-06 14:17:5943// Per-tab extension helper. Also handles non-extension apps.
[email protected]a6394ae2012-07-16 20:58:4344class TabHelper : public content::WebContentsObserver,
rdevlin.cronin1f047f7b2016-06-06 18:30:1845 public ExtensionFunctionDispatcher::Delegate,
46 public ExtensionRegistryObserver,
Benjamin Ackermanc4fb02302018-10-03 19:55:4147 public content::WebContentsUserData<TabHelper> {
[email protected]36fb2c7c2011-04-04 15:49:0848 public:
dchengae36a4a2014-10-21 12:36:3649 ~TabHelper() override;
[email protected]36fb2c7c2011-04-04 15:49:0850
[email protected]36fb2c7c2011-04-04 15:49:0851 // Sets the extension denoting this as an app. If |extension| is non-null this
[email protected]0932b30c2012-04-17 13:25:1052 // tab becomes an app-tab. WebContents does not listen for unload events for
53 // the extension. It's up to consumers of WebContents to do that.
[email protected]36fb2c7c2011-04-04 15:49:0854 //
55 // NOTE: this should only be manipulated before the tab is added to a browser.
56 // TODO(sky): resolve if this is the right way to identify an app tab. If it
57 // is, than this should be passed in the constructor.
[email protected]a6394ae2012-07-16 20:58:4358 void SetExtensionApp(const Extension* extension);
[email protected]36fb2c7c2011-04-04 15:49:0859
60 // Convenience for setting the app extension by id. This does nothing if
61 // |extension_app_id| is empty, or an extension can't be found given the
62 // specified id.
rdevlin.cronind8076cd62016-07-08 23:05:5863 void SetExtensionAppById(const ExtensionId& extension_app_id);
[email protected]36fb2c7c2011-04-04 15:49:0864
Alexey Baskakov21174782018-09-19 02:46:3965 // Returns true if an app extension has been set.
66 bool is_app() const { return extension_app_ != nullptr; }
67
68 // Return ExtensionId for extension app.
69 // If an app extension has not been set, returns empty id.
70 ExtensionId GetAppId() const;
[email protected]36fb2c7c2011-04-04 15:49:0871
[email protected]0932b30c2012-04-17 13:25:1072 // If an app extension has been explicitly set for this WebContents its icon
[email protected]36fb2c7c2011-04-04 15:49:0873 // is returned.
74 //
75 // NOTE: the returned icon is larger than 16x16 (its size is
[email protected]1d5e58b2013-01-31 08:41:4076 // extension_misc::EXTENSION_ICON_SMALLISH).
[email protected]36fb2c7c2011-04-04 15:49:0877 SkBitmap* GetExtensionAppIcon();
78
[email protected]a6394ae2012-07-16 20:58:4379 ScriptExecutor* script_executor() {
[email protected]09ae70d42012-11-07 00:42:0980 return script_executor_.get();
[email protected]af78a802012-07-10 23:47:0281 }
[email protected]a83b8402012-05-17 06:56:4482
rdevlin.cronin8408b4f92016-03-15 19:14:1483 ExtensionActionRunner* extension_action_runner() {
84 return extension_action_runner_.get();
rdevlin.cronin91f162a12014-09-03 16:48:4085 }
86
[email protected]78ce3022012-09-24 01:48:4887 ActiveTabPermissionGranter* active_tab_permission_granter() {
88 return active_tab_permission_granter_.get();
[email protected]fc5e65d6b2012-06-13 00:22:5789 }
90
[email protected]36fb2c7c2011-04-04 15:49:0891 private:
wittman2b0e40652015-06-10 00:53:0392 // Utility function to invoke member functions on all relevant
93 // ContentRulesRegistries.
94 template <class Func>
95 void InvokeForContentRulesRegistries(const Func& func);
96
[email protected]a78f03c2012-09-15 05:08:1997 explicit TabHelper(content::WebContents* web_contents);
catmullingsba539102017-05-26 19:45:1098
[email protected]46b3c982012-10-09 18:38:3099 friend class content::WebContentsUserData<TabHelper>;
[email protected]a78f03c2012-09-15 05:08:19100
[email protected]d8c660432011-12-22 20:51:25101 // content::WebContentsObserver overrides.
rdevlin.croninb67a34772015-06-04 16:32:38102 void RenderFrameCreated(content::RenderFrameHost* host) override;
jamf1c7f0c2017-02-02 01:04:37103 void DidFinishNavigation(
104 content::NavigationHandle* navigation_handle) override;
dchengae36a4a2014-10-21 12:36:36105 bool OnMessageReceived(const IPC::Message& message,
lukasza53fe8fd82017-06-20 23:38:34106 content::RenderFrameHost* sender) override;
dchengae36a4a2014-10-21 12:36:36107 void DidCloneToNewWebContents(
[email protected]7381d9f2012-09-12 20:26:22108 content::WebContents* old_web_contents,
mostynba15bee12014-10-04 00:40:32109 content::WebContents* new_web_contents) override;
[email protected]553602e12011-04-05 17:01:18110
catmullingsba539102017-05-26 19:45:10111 // ExtensionFunctionDispatcher::Delegate overrides.
112 WindowController* GetExtensionWindowController() const override;
dchengae36a4a2014-10-21 12:36:36113 content::WebContents* GetAssociatedWebContents() const override;
[email protected]c5dbef02011-05-13 05:06:09114
rdevlin.cronin1f047f7b2016-06-06 18:30:18115 // ExtensionRegistryObserver:
116 void OnExtensionUnloaded(content::BrowserContext* browser_context,
117 const Extension* extension,
limasdf0deef2042017-05-03 19:17:17118 UnloadedExtensionReason reason) override;
rdevlin.cronin1f047f7b2016-06-06 18:30:18119
[email protected]553602e12011-04-05 17:01:18120 // Message handlers.
rdevlin.cronin7df58052015-07-10 20:30:20121 void OnGetAppInstallState(content::RenderFrameHost* host,
122 const GURL& requestor_url,
[email protected]f2fe87c2012-04-24 17:53:49123 int return_route_id,
124 int callback_id);
Trent Apted8f733b92018-10-04 00:54:45125 void OnContentScriptsExecuting(content::RenderFrameHost* host,
126 const ExecutingScriptsMap& extension_ids,
127 const GURL& on_url);
[email protected]36fb2c7c2011-04-04 15:49:08128
129 // App extensions related methods:
130
[email protected]75b91fd2013-02-12 22:14:25131 // Resets app_icon_ and if |extension| is non-null uses ImageLoader to load
132 // the extension's image asynchronously.
[email protected]a6394ae2012-07-16 20:58:43133 void UpdateExtensionAppIcon(const Extension* extension);
[email protected]36fb2c7c2011-04-04 15:49:08134
rdevlin.cronind8076cd62016-07-08 23:05:58135 const Extension* GetExtension(const ExtensionId& extension_app_id);
[email protected]dd290d32012-03-06 02:47:51136
[email protected]7069ed82013-01-26 01:39:53137 void OnImageLoaded(const gfx::Image& image);
[email protected]8915f342011-08-29 22:14:37138
rdevlin.croninb67a34772015-06-04 16:32:38139 // Sends our tab ID to |render_frame_host|.
140 void SetTabId(content::RenderFrameHost* render_frame_host);
[email protected]2fc1cad12013-05-21 00:41:39141
wittman2b0e40652015-06-10 00:53:03142 Profile* profile_;
[email protected]36fb2c7c2011-04-04 15:49:08143
144 // If non-null this tab is an app tab and this is the extension the tab was
145 // created for.
[email protected]a6394ae2012-07-16 20:58:43146 const Extension* extension_app_;
[email protected]36fb2c7c2011-04-04 15:49:08147
[email protected]74e51402011-04-06 14:17:59148 // Icon for extension_app_ (if non-null) or a manually-set icon for
149 // non-extension apps.
[email protected]36fb2c7c2011-04-04 15:49:08150 SkBitmap extension_app_icon_;
151
dchengc963c7142016-04-08 03:55:22152 std::unique_ptr<ScriptExecutor> script_executor_;
[email protected]af78a802012-07-10 23:47:02153
dchengc963c7142016-04-08 03:55:22154 std::unique_ptr<ExtensionActionRunner> extension_action_runner_;
rdevlin.cronin91f162a12014-09-03 16:48:40155
dchengc963c7142016-04-08 03:55:22156 std::unique_ptr<ActiveTabPermissionGranter> active_tab_permission_granter_;
[email protected]fc5e65d6b2012-06-13 00:22:57157
rdevlin.cronin1f047f7b2016-06-06 18:30:18158 ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
Evan Stade75872a62019-09-06 21:17:38159 registry_observer_{this};
rdevlin.cronin1f047f7b2016-06-06 18:30:18160
mohan.reddy63d63002014-09-16 04:13:56161 // Vend weak pointers that can be invalidated to stop in-progress loads.
Jeremy Roman495db682019-07-12 16:03:24162 base::WeakPtrFactory<TabHelper> image_loader_ptr_factory_{this};
mohan.reddy63d63002014-09-16 04:13:56163
rdevlin.cronin092c6772014-11-20 23:52:40164 // Generic weak ptr factory for posting callbacks.
Jeremy Roman495db682019-07-12 16:03:24165 base::WeakPtrFactory<TabHelper> weak_ptr_factory_{this};
rdevlin.cronin092c6772014-11-20 23:52:40166
François Doray4f51d5d2018-12-03 22:26:24167 WEB_CONTENTS_USER_DATA_KEY_DECL();
168
[email protected]a6394ae2012-07-16 20:58:43169 DISALLOW_COPY_AND_ASSIGN(TabHelper);
[email protected]36fb2c7c2011-04-04 15:49:08170};
171
[email protected]a6394ae2012-07-16 20:58:43172} // namespace extensions
173
174#endif // CHROME_BROWSER_EXTENSIONS_TAB_HELPER_H_