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

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

Issue 296483011: Run any pending injections in ActiveScriptController if permission is granted (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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_script_controller.h" 5 #include "chrome/browser/extensions/active_script_controller.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 CHECK(extension); 94 CHECK(extension);
95 PendingRequestList& list = pending_requests_[extension->id()]; 95 PendingRequestList& list = pending_requests_[extension->id()];
96 list.push_back(PendingRequest(callback, page_id)); 96 list.push_back(PendingRequest(callback, page_id));
97 97
98 // If this was the first entry, notify the location bar that there's a new 98 // If this was the first entry, notify the location bar that there's a new
99 // icon. 99 // icon.
100 if (list.size() == 1u) 100 if (list.size() == 1u)
101 LocationBarController::NotifyChange(web_contents()); 101 LocationBarController::NotifyChange(web_contents());
102 } 102 }
103 103
104 void ActiveScriptController::OnActiveTabPermissionGranted(
105 const Extension* extension) {
106 DCHECK(extension);
107 RunPendingForExtension(extension);
108 }
109
104 void ActiveScriptController::OnAdInjectionDetected( 110 void ActiveScriptController::OnAdInjectionDetected(
105 const std::vector<std::string> ad_injectors) { 111 const std::vector<std::string> ad_injectors) {
106 // We're only interested in data if there are ad injectors detected. 112 // We're only interested in data if there are ad injectors detected.
107 if (ad_injectors.empty()) 113 if (ad_injectors.empty())
108 return; 114 return;
109 115
110 size_t num_preventable_ad_injectors = 116 size_t num_preventable_ad_injectors =
111 base::STLSetIntersection<std::set<std::string> >( 117 base::STLSetIntersection<std::set<std::string> >(
112 ad_injectors, permitted_extensions_).size(); 118 ad_injectors, permitted_extensions_).size();
113 119
(...skipping 29 matching lines...) Expand all
143 make_scoped_ptr(new ExtensionIconSet(action_info->default_icon))); 149 make_scoped_ptr(new ExtensionIconSet(action_info->default_icon)));
144 } 150 }
145 151
146 active_script_actions_[extension->id()] = action; 152 active_script_actions_[extension->id()] = action;
147 return action.get(); 153 return action.get();
148 } 154 }
149 155
150 LocationBarController::Action ActiveScriptController::OnClicked( 156 LocationBarController::Action ActiveScriptController::OnClicked(
151 const Extension* extension) { 157 const Extension* extension) {
152 DCHECK(extension); 158 DCHECK(extension);
159 DCHECK(ContainsKey(pending_requests_, extension->id()));
160 RunPendingForExtension(extension);
161 return LocationBarController::ACTION_NONE;
162 }
163
164 void ActiveScriptController::OnNavigated() {
165 LogUMA();
166 permitted_extensions_.clear();
167 pending_requests_.clear();
168 }
169
170 void ActiveScriptController::RunPendingForExtension(
171 const Extension* extension) {
172 DCHECK(extension);
not at google - send to devlin 2014/05/22 20:44:49 you already DCHECK the extension at all call sites
Devlin 2014/05/22 22:12:36 Fair enough - maybe I was a bit DCHECK() happy. :)
153 PendingRequestMap::iterator iter = 173 PendingRequestMap::iterator iter =
154 pending_requests_.find(extension->id()); 174 pending_requests_.find(extension->id());
155 DCHECK(iter != pending_requests_.end()); 175 if (iter ==pending_requests_.end())
not at google - send to devlin 2014/05/22 20:44:49 s/ ==/ == /
Devlin 2014/05/22 22:12:36 Done.
176 return;
156 177
157 content::NavigationEntry* visible_entry = 178 content::NavigationEntry* visible_entry =
158 web_contents()->GetController().GetVisibleEntry(); 179 web_contents()->GetController().GetVisibleEntry();
159 // Refuse to run if there's no visible entry, because we have no idea of 180 // Refuse to run if there's no visible entry, because we have no idea of
160 // determining if it's the proper page. This should rarely, if ever, happen. 181 // determining if it's the proper page. This should rarely, if ever, happen.
161 if (!visible_entry) 182 if (!visible_entry)
162 return LocationBarController::ACTION_NONE; 183 return;
163 184
164 int page_id = visible_entry->GetPageID(); 185 int page_id = visible_entry->GetPageID();
165 186
166 // We add this to the list of permitted extensions and erase pending entries 187 // We add this to the list of permitted extensions and erase pending entries
167 // *before* running them to guard against the crazy case where running the 188 // *before* running them to guard against the crazy case where running the
168 // callbacks adds more entries. 189 // callbacks adds more entries.
169 permitted_extensions_.insert(extension->id()); 190 permitted_extensions_.insert(extension->id());
170 PendingRequestList requests; 191 PendingRequestList requests;
171 iter->second.swap(requests); 192 iter->second.swap(requests);
172 pending_requests_.erase(extension->id()); 193 pending_requests_.erase(extension->id());
173 194
174 // Clicking to run the extension counts as granting it permission to run on 195 // Clicking to run the extension counts as granting it permission to run on
175 // the given tab. 196 // the given tab.
197 // The extension may already have active tab at this point, but granting
198 // it twice is essentially a no-op.
176 TabHelper::FromWebContents(web_contents())-> 199 TabHelper::FromWebContents(web_contents())->
177 active_tab_permission_granter()->GrantIfRequested(extension); 200 active_tab_permission_granter()->GrantIfRequested(extension);
178 201
179 // Run all pending injections for the given extension. 202 // Run all pending injections for the given extension.
180 for (PendingRequestList::iterator request = requests.begin(); 203 for (PendingRequestList::iterator request = requests.begin();
181 request != requests.end(); 204 request != requests.end();
182 ++request) { 205 ++request) {
183 // Only run if it's on the proper page. 206 // Only run if it's on the proper page.
184 if (request->page_id == page_id) 207 if (request->page_id == page_id)
185 request->closure.Run(); 208 request->closure.Run();
186 } 209 }
187 210
188 // Inform the location bar that the action is now gone. 211 // Inform the location bar that the action is now gone.
189 LocationBarController::NotifyChange(web_contents()); 212 LocationBarController::NotifyChange(web_contents());
190
191 return LocationBarController::ACTION_NONE;
192 }
193
194 void ActiveScriptController::OnNavigated() {
195 LogUMA();
196 permitted_extensions_.clear();
197 pending_requests_.clear();
198 } 213 }
199 214
200 void ActiveScriptController::OnNotifyExtensionScriptExecution( 215 void ActiveScriptController::OnNotifyExtensionScriptExecution(
201 const std::string& extension_id, 216 const std::string& extension_id,
202 int page_id) { 217 int page_id) {
203 if (!Extension::IdIsValid(extension_id)) { 218 if (!Extension::IdIsValid(extension_id)) {
204 NOTREACHED() << "'" << extension_id << "' is not a valid id."; 219 NOTREACHED() << "'" << extension_id << "' is not a valid id.";
205 return; 220 return;
206 } 221 }
207 222
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 UMA_HISTOGRAM_COUNTS_100( 256 UMA_HISTOGRAM_COUNTS_100(
242 "Extensions.ActiveScriptController.PermittedExtensions", 257 "Extensions.ActiveScriptController.PermittedExtensions",
243 permitted_extensions_.size()); 258 permitted_extensions_.size());
244 UMA_HISTOGRAM_COUNTS_100( 259 UMA_HISTOGRAM_COUNTS_100(
245 "Extensions.ActiveScriptController.DeniedExtensions", 260 "Extensions.ActiveScriptController.DeniedExtensions",
246 pending_requests_.size()); 261 pending_requests_.size());
247 } 262 }
248 } 263 }
249 264
250 } // namespace extensions 265 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698