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

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"
14 #include "extensions/browser/extension_host.h"
13 #include "extensions/browser/extension_registry.h" 15 #include "extensions/browser/extension_registry.h"
16 #include "extensions/browser/process_manager.h"
14 #include "extensions/common/extension_messages.h" 17 #include "extensions/common/extension_messages.h"
15 #include "extensions/common/feature_switch.h" 18 #include "extensions/common/feature_switch.h"
16 #include "extensions/common/permissions/permission_set.h" 19 #include "extensions/common/permissions/permission_set.h"
17 #include "extensions/common/permissions/permissions_data.h" 20 #include "extensions/common/permissions/permissions_data.h"
18 #include "extensions/common/user_script.h" 21 #include "extensions/common/user_script.h"
19 #include "url/gurl.h" 22 #include "url/gurl.h"
20 23
21 using content::RenderProcessHost; 24 using content::RenderProcessHost;
22 using content::WebContentsObserver; 25 using content::WebContentsObserver;
23 26
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 62
60 if (!new_apis.empty() || !new_hosts.is_empty()) { 63 if (!new_apis.empty() || !new_hosts.is_empty()) {
61 granted_extensions_.Insert(extension); 64 granted_extensions_.Insert(extension);
62 scoped_refptr<const PermissionSet> new_permissions = 65 scoped_refptr<const PermissionSet> new_permissions =
63 new PermissionSet(new_apis, ManifestPermissionSet(), 66 new PermissionSet(new_apis, ManifestPermissionSet(),
64 new_hosts, URLPatternSet()); 67 new_hosts, URLPatternSet());
65 permissions_data->UpdateTabSpecificPermissions(tab_id_, new_permissions); 68 permissions_data->UpdateTabSpecificPermissions(tab_id_, new_permissions);
66 const content::NavigationEntry* navigation_entry = 69 const content::NavigationEntry* navigation_entry =
67 web_contents()->GetController().GetVisibleEntry(); 70 web_contents()->GetController().GetVisibleEntry();
68 if (navigation_entry) { 71 if (navigation_entry) {
69 content::RenderViewHost* render_view_host = 72 std::set<content::RenderProcessHost*> hosts;
70 web_contents()->GetRenderViewHost(); 73 // We update the tabs renderer, as well as the extension's background page
71 render_view_host->Send(new ExtensionMsg_UpdateTabSpecificPermissions( 74 // if one exists.
72 render_view_host->GetRoutingID(), 75 hosts.insert(web_contents()->GetRenderProcessHost());
73 navigation_entry->GetURL(), 76 ExtensionHost* background_page =
74 extension->id(), 77 ProcessManager::Get(web_contents()->GetBrowserContext())->
75 new_hosts)); 78 GetBackgroundHostForExtension(extension->id());
not at google - send to devlin 2015/02/03 19:29:12 What about if the event page hasn't started yet? F
Devlin 2015/02/04 22:26:02 Good point. Done.
79 if (background_page)
80 hosts.insert(background_page->render_process_host());
81
82 for (content::RenderProcessHost* host : hosts) {
83 host->Send(new ExtensionMsg_UpdateTabSpecificPermissions(
84 navigation_entry->GetURL(),
85 extension->id(),
86 new_hosts,
87 tab_id_));
88 }
89
76 // If more things ever need to know about this, we should consider making 90 // If more things ever need to know about this, we should consider making
77 // an observer class. 91 // an observer class.
78 // It's important that this comes after the IPC is sent to the renderer, 92 // 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 93 // so that any tasks executing in the renderer occur after it has the
80 // updated permissions. 94 // updated permissions.
81 ActiveScriptController::GetForWebContents(web_contents()) 95 ActiveScriptController::GetForWebContents(web_contents())
82 ->OnActiveTabPermissionGranted(extension); 96 ->OnActiveTabPermissionGranted(extension);
83 } 97 }
84 } 98 }
85 } 99 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 // Note: don't need to clear the permissions (nor tell the renderer about it) 136 // Note: don't need to clear the permissions (nor tell the renderer about it)
123 // because it's being unloaded anyway. 137 // because it's being unloaded anyway.
124 granted_extensions_.Remove(extension->id()); 138 granted_extensions_.Remove(extension->id());
125 } 139 }
126 140
127 void ActiveTabPermissionGranter::ClearActiveExtensionsAndNotify() { 141 void ActiveTabPermissionGranter::ClearActiveExtensionsAndNotify() {
128 if (granted_extensions_.is_empty()) 142 if (granted_extensions_.is_empty())
129 return; 143 return;
130 144
131 std::vector<std::string> extension_ids; 145 std::vector<std::string> extension_ids;
146 std::set<content::RenderProcessHost*> hosts;
147 hosts.insert(web_contents()->GetRenderProcessHost());
132 148
149 ProcessManager* process_manager =
150 ProcessManager::Get(web_contents()->GetBrowserContext());
133 for (ExtensionSet::const_iterator it = granted_extensions_.begin(); 151 for (ExtensionSet::const_iterator it = granted_extensions_.begin();
134 it != granted_extensions_.end(); ++it) { 152 it != granted_extensions_.end(); ++it) {
135 it->get()->permissions_data()->ClearTabSpecificPermissions(tab_id_); 153 it->get()->permissions_data()->ClearTabSpecificPermissions(tab_id_);
136 extension_ids.push_back((*it)->id()); 154 extension_ids.push_back((*it)->id());
155 ExtensionHost* background_page =
156 process_manager->GetBackgroundHostForExtension(it->get()->id());
157 if (background_page)
158 hosts.insert(background_page->render_process_host());
137 } 159 }
138 160
139 content::RenderViewHost* render_view_host = 161 // Notify the tab and any extension background pages.
140 web_contents()->GetRenderViewHost(); 162 for (content::RenderProcessHost* host : hosts) {
141 render_view_host->Send(new ExtensionMsg_ClearTabSpecificPermissions( 163 host->Send(new ExtensionMsg_ClearTabSpecificPermissions(
142 render_view_host->GetRoutingID(), extension_ids)); 164 extension_ids, tab_id_));
165 }
143 granted_extensions_.Clear(); 166 granted_extensions_.Clear();
144 } 167 }
145 168
146 } // namespace extensions 169 } // namespace extensions
OLDNEW
« no previous file with comments | « no previous file | chrome/chrome_renderer.gypi » ('j') | chrome/test/data/extensions/api_test/active_tab/background.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698