Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Side by Side Diff: chrome/browser/extensions/active_tab_permission_granter.cc

Issue 890083002: [Extensions] Propagate activeTab hosts to extension background pages (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/active_tab_permission_granter.h" 5 #include "chrome/browser/extensions/active_tab_permission_granter.h"
6 6
7 #include "chrome/browser/extensions/active_script_controller.h" 7 #include "chrome/browser/extensions/active_script_controller.h"
8 #include "chrome/browser/profiles/profile.h" 8 #include "chrome/browser/profiles/profile.h"
9 #include "content/public/browser/navigation_details.h" 9 #include "content/public/browser/navigation_details.h"
10 #include "content/public/browser/navigation_entry.h" 10 #include "content/public/browser/navigation_entry.h"
11 #include "content/public/browser/render_process_host.h"
11 #include "content/public/browser/render_view_host.h" 12 #include "content/public/browser/render_view_host.h"
12 #include "content/public/browser/web_contents.h" 13 #include "content/public/browser/web_contents.h"
13 #include "extensions/browser/extension_registry.h" 14 #include "extensions/browser/extension_registry.h"
15 #include "extensions/browser/process_manager.h"
14 #include "extensions/common/extension_messages.h" 16 #include "extensions/common/extension_messages.h"
15 #include "extensions/common/feature_switch.h" 17 #include "extensions/common/feature_switch.h"
16 #include "extensions/common/permissions/permission_set.h" 18 #include "extensions/common/permissions/permission_set.h"
17 #include "extensions/common/permissions/permissions_data.h" 19 #include "extensions/common/permissions/permissions_data.h"
18 #include "extensions/common/user_script.h" 20 #include "extensions/common/user_script.h"
19 #include "url/gurl.h" 21 #include "url/gurl.h"
20 22
21 using content::RenderProcessHost; 23 namespace extensions {
22 using content::WebContentsObserver;
23 24
24 namespace extensions { 25 namespace {
26
27 using CreateMessageFunction = base::Callback<IPC::Message*(bool)>;
28
29 // Creates a new IPC message for updating tab-specific permissions.
30 IPC::Message* CreateUpdateMessage(const GURL& visible_url,
31 const std::string& extension_id,
32 const URLPatternSet& new_hosts,
33 int tab_id,
34 bool update_whitelist) {
35 return new ExtensionMsg_UpdateTabSpecificPermissions(
36 visible_url, extension_id, new_hosts, update_whitelist, tab_id);
37 }
38
39 // Creates a new IPC message for clearing tab-specific permissions.
40 IPC::Message* CreateClearMessage(const std::vector<std::string>& ids,
41 int tab_id,
42 bool update_whitelist) {
43 return new ExtensionMsg_ClearTabSpecificPermissions(
44 ids, update_whitelist, tab_id);
45 }
46
47 // Sends a message exactly once to each render process host owning one of the
48 // given |view_hosts|. If |tab_process| does not own one of the |view_hosts|,
49 // also sends a message to the tab process.
not at google - send to devlin 2015/02/05 00:16:13 So, you could replace the second sentence of this
Devlin 2015/02/05 19:54:49 Done.
50 void SendMessageToProcesses(
51 const std::set<content::RenderViewHost*>& view_hosts,
52 content::RenderProcessHost* tab_process,
53 const CreateMessageFunction& create_message) {
54 std::set<content::RenderProcessHost*> sent_to_hosts;
55 for (content::RenderViewHost* view_host : view_hosts) {
56 content::RenderProcessHost* process_host = view_host->GetProcess();
57 if (sent_to_hosts.count(process_host) == 0) {
58 // Extension processes have to update the origin whitelists.
59 process_host->Send(create_message.Run(true));
60 sent_to_hosts.insert(view_host->GetProcess());
61 }
62 }
63 // If the tab wasn't one of those processes already updated (it likely
64 // wasn't), update it. Tabs don't need to update the origin whitelist.
65 if (sent_to_hosts.count(tab_process) == 0)
66 tab_process->Send(create_message.Run(false));
67 }
68
69 } // namespace
25 70
26 ActiveTabPermissionGranter::ActiveTabPermissionGranter( 71 ActiveTabPermissionGranter::ActiveTabPermissionGranter(
27 content::WebContents* web_contents, 72 content::WebContents* web_contents,
28 int tab_id, 73 int tab_id,
29 Profile* profile) 74 Profile* profile)
30 : WebContentsObserver(web_contents), 75 : content::WebContentsObserver(web_contents),
31 tab_id_(tab_id), 76 tab_id_(tab_id),
32 extension_registry_observer_(this) { 77 extension_registry_observer_(this) {
33 extension_registry_observer_.Add(ExtensionRegistry::Get(profile)); 78 extension_registry_observer_.Add(ExtensionRegistry::Get(profile));
34 } 79 }
35 80
36 ActiveTabPermissionGranter::~ActiveTabPermissionGranter() {} 81 ActiveTabPermissionGranter::~ActiveTabPermissionGranter() {}
37 82
38 void ActiveTabPermissionGranter::GrantIfRequested(const Extension* extension) { 83 void ActiveTabPermissionGranter::GrantIfRequested(const Extension* extension) {
39 if (granted_extensions_.Contains(extension->id())) 84 if (granted_extensions_.Contains(extension->id()))
40 return; 85 return;
(...skipping 18 matching lines...) Expand all
59 104
60 if (!new_apis.empty() || !new_hosts.is_empty()) { 105 if (!new_apis.empty() || !new_hosts.is_empty()) {
61 granted_extensions_.Insert(extension); 106 granted_extensions_.Insert(extension);
62 scoped_refptr<const PermissionSet> new_permissions = 107 scoped_refptr<const PermissionSet> new_permissions =
63 new PermissionSet(new_apis, ManifestPermissionSet(), 108 new PermissionSet(new_apis, ManifestPermissionSet(),
64 new_hosts, URLPatternSet()); 109 new_hosts, URLPatternSet());
65 permissions_data->UpdateTabSpecificPermissions(tab_id_, new_permissions); 110 permissions_data->UpdateTabSpecificPermissions(tab_id_, new_permissions);
66 const content::NavigationEntry* navigation_entry = 111 const content::NavigationEntry* navigation_entry =
67 web_contents()->GetController().GetVisibleEntry(); 112 web_contents()->GetController().GetVisibleEntry();
68 if (navigation_entry) { 113 if (navigation_entry) {
69 content::RenderViewHost* render_view_host = 114 // We update all extension render views with the new tab permissions, and
70 web_contents()->GetRenderViewHost(); 115 // also the tab itself.
71 render_view_host->Send(new ExtensionMsg_UpdateTabSpecificPermissions( 116 CreateMessageFunction create_message =
not at google - send to devlin 2015/02/05 00:16:13 call this |update_message|, and below |clear_messa
Devlin 2015/02/05 19:54:50 Done.
72 render_view_host->GetRoutingID(), 117 base::Bind(&CreateUpdateMessage,
73 navigation_entry->GetURL(), 118 navigation_entry->GetURL(),
74 extension->id(), 119 extension->id(),
75 new_hosts)); 120 new_hosts,
121 tab_id_);
122 SendMessageToProcesses(
123 ProcessManager::Get(web_contents()->GetBrowserContext())->
124 GetRenderViewHostsForExtension(extension->id()),
125 web_contents()->GetRenderProcessHost(),
126 create_message);
127
76 // If more things ever need to know about this, we should consider making 128 // If more things ever need to know about this, we should consider making
77 // an observer class. 129 // an observer class.
78 // It's important that this comes after the IPC is sent to the renderer, 130 // It's important that this comes after the IPC is sent to the renderer,
79 // so that any tasks executing in the renderer occur after it has the 131 // so that any tasks executing in the renderer occur after it has the
80 // updated permissions. 132 // updated permissions.
81 ActiveScriptController::GetForWebContents(web_contents()) 133 ActiveScriptController::GetForWebContents(web_contents())
82 ->OnActiveTabPermissionGranted(extension); 134 ->OnActiveTabPermissionGranted(extension);
83 } 135 }
84 } 136 }
85 } 137 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 UnloadedExtensionInfo::Reason reason) { 173 UnloadedExtensionInfo::Reason reason) {
122 // Note: don't need to clear the permissions (nor tell the renderer about it) 174 // Note: don't need to clear the permissions (nor tell the renderer about it)
123 // because it's being unloaded anyway. 175 // because it's being unloaded anyway.
124 granted_extensions_.Remove(extension->id()); 176 granted_extensions_.Remove(extension->id());
125 } 177 }
126 178
127 void ActiveTabPermissionGranter::ClearActiveExtensionsAndNotify() { 179 void ActiveTabPermissionGranter::ClearActiveExtensionsAndNotify() {
128 if (granted_extensions_.is_empty()) 180 if (granted_extensions_.is_empty())
129 return; 181 return;
130 182
183 std::set<content::RenderViewHost*> view_hosts;
131 std::vector<std::string> extension_ids; 184 std::vector<std::string> extension_ids;
132 185 ProcessManager* process_manager =
133 for (ExtensionSet::const_iterator it = granted_extensions_.begin(); 186 ProcessManager::Get(web_contents()->GetBrowserContext());
134 it != granted_extensions_.end(); ++it) { 187 for (const scoped_refptr<const Extension>& extension : granted_extensions_) {
135 it->get()->permissions_data()->ClearTabSpecificPermissions(tab_id_); 188 extension->permissions_data()->ClearTabSpecificPermissions(tab_id_);
136 extension_ids.push_back((*it)->id()); 189 extension_ids.push_back(extension->id());
190 std::set<content::RenderViewHost*> extension_view_hosts =
191 process_manager->GetRenderViewHostsForExtension(extension->id());
192 view_hosts.insert(extension_view_hosts.begin(), extension_view_hosts.end());
137 } 193 }
138 194
139 content::RenderViewHost* render_view_host = 195 CreateMessageFunction create_message =
140 web_contents()->GetRenderViewHost(); 196 base::Bind(&CreateClearMessage, extension_ids, tab_id_);
141 render_view_host->Send(new ExtensionMsg_ClearTabSpecificPermissions( 197 SendMessageToProcesses(view_hosts,
142 render_view_host->GetRoutingID(), extension_ids)); 198 web_contents()->GetRenderProcessHost(),
199 create_message);
200
143 granted_extensions_.Clear(); 201 granted_extensions_.Clear();
144 } 202 }
145 203
146 } // namespace extensions 204 } // namespace extensions
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/extensions/extension_service.cc » ('j') | chrome/browser/extensions/extension_service.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698