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

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: Ben's 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 RunPendingForExtension(extension);
107 }
108
104 void ActiveScriptController::OnAdInjectionDetected( 109 void ActiveScriptController::OnAdInjectionDetected(
105 const std::vector<std::string> ad_injectors) { 110 const std::vector<std::string> ad_injectors) {
106 // We're only interested in data if there are ad injectors detected. 111 // We're only interested in data if there are ad injectors detected.
107 if (ad_injectors.empty()) 112 if (ad_injectors.empty())
108 return; 113 return;
109 114
110 size_t num_preventable_ad_injectors = 115 size_t num_preventable_ad_injectors =
111 base::STLSetIntersection<std::set<std::string> >( 116 base::STLSetIntersection<std::set<std::string> >(
112 ad_injectors, permitted_extensions_).size(); 117 ad_injectors, permitted_extensions_).size();
113 118
(...skipping 28 matching lines...) Expand all
142 action->set_default_icon( 147 action->set_default_icon(
143 make_scoped_ptr(new ExtensionIconSet(action_info->default_icon))); 148 make_scoped_ptr(new ExtensionIconSet(action_info->default_icon)));
144 } 149 }
145 150
146 active_script_actions_[extension->id()] = action; 151 active_script_actions_[extension->id()] = action;
147 return action.get(); 152 return action.get();
148 } 153 }
149 154
150 LocationBarController::Action ActiveScriptController::OnClicked( 155 LocationBarController::Action ActiveScriptController::OnClicked(
151 const Extension* extension) { 156 const Extension* extension) {
157 DCHECK(ContainsKey(pending_requests_, extension->id()));
158 RunPendingForExtension(extension);
159 return LocationBarController::ACTION_NONE;
160 }
161
162 void ActiveScriptController::OnNavigated() {
163 LogUMA();
164 permitted_extensions_.clear();
165 pending_requests_.clear();
166 }
167
168 void ActiveScriptController::RunPendingForExtension(
169 const Extension* extension) {
152 DCHECK(extension); 170 DCHECK(extension);
153 PendingRequestMap::iterator iter = 171 PendingRequestMap::iterator iter =
154 pending_requests_.find(extension->id()); 172 pending_requests_.find(extension->id());
155 DCHECK(iter != pending_requests_.end()); 173 if (iter == pending_requests_.end())
174 return;
156 175
157 content::NavigationEntry* visible_entry = 176 content::NavigationEntry* visible_entry =
158 web_contents()->GetController().GetVisibleEntry(); 177 web_contents()->GetController().GetVisibleEntry();
159 // Refuse to run if there's no visible entry, because we have no idea of 178 // 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. 179 // determining if it's the proper page. This should rarely, if ever, happen.
161 if (!visible_entry) 180 if (!visible_entry)
162 return LocationBarController::ACTION_NONE; 181 return;
163 182
164 int page_id = visible_entry->GetPageID(); 183 int page_id = visible_entry->GetPageID();
165 184
166 // We add this to the list of permitted extensions and erase pending entries 185 // 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 186 // *before* running them to guard against the crazy case where running the
168 // callbacks adds more entries. 187 // callbacks adds more entries.
169 permitted_extensions_.insert(extension->id()); 188 permitted_extensions_.insert(extension->id());
170 PendingRequestList requests; 189 PendingRequestList requests;
171 iter->second.swap(requests); 190 iter->second.swap(requests);
172 pending_requests_.erase(extension->id()); 191 pending_requests_.erase(extension->id());
173 192
174 // Clicking to run the extension counts as granting it permission to run on 193 // Clicking to run the extension counts as granting it permission to run on
175 // the given tab. 194 // the given tab.
195 // The extension may already have active tab at this point, but granting
196 // it twice is essentially a no-op.
176 TabHelper::FromWebContents(web_contents())-> 197 TabHelper::FromWebContents(web_contents())->
177 active_tab_permission_granter()->GrantIfRequested(extension); 198 active_tab_permission_granter()->GrantIfRequested(extension);
178 199
179 // Run all pending injections for the given extension. 200 // Run all pending injections for the given extension.
180 for (PendingRequestList::iterator request = requests.begin(); 201 for (PendingRequestList::iterator request = requests.begin();
181 request != requests.end(); 202 request != requests.end();
182 ++request) { 203 ++request) {
183 // Only run if it's on the proper page. 204 // Only run if it's on the proper page.
184 if (request->page_id == page_id) 205 if (request->page_id == page_id)
185 request->closure.Run(); 206 request->closure.Run();
186 } 207 }
187 208
188 // Inform the location bar that the action is now gone. 209 // Inform the location bar that the action is now gone.
189 LocationBarController::NotifyChange(web_contents()); 210 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 } 211 }
199 212
200 void ActiveScriptController::OnNotifyExtensionScriptExecution( 213 void ActiveScriptController::OnNotifyExtensionScriptExecution(
201 const std::string& extension_id, 214 const std::string& extension_id,
202 int page_id) { 215 int page_id) {
203 if (!Extension::IdIsValid(extension_id)) { 216 if (!Extension::IdIsValid(extension_id)) {
204 NOTREACHED() << "'" << extension_id << "' is not a valid id."; 217 NOTREACHED() << "'" << extension_id << "' is not a valid id.";
205 return; 218 return;
206 } 219 }
207 220
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 UMA_HISTOGRAM_COUNTS_100( 254 UMA_HISTOGRAM_COUNTS_100(
242 "Extensions.ActiveScriptController.PermittedExtensions", 255 "Extensions.ActiveScriptController.PermittedExtensions",
243 permitted_extensions_.size()); 256 permitted_extensions_.size());
244 UMA_HISTOGRAM_COUNTS_100( 257 UMA_HISTOGRAM_COUNTS_100(
245 "Extensions.ActiveScriptController.DeniedExtensions", 258 "Extensions.ActiveScriptController.DeniedExtensions",
246 pending_requests_.size()); 259 pending_requests_.size());
247 } 260 }
248 } 261 }
249 262
250 } // namespace extensions 263 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/active_script_controller.h ('k') | chrome/browser/extensions/active_script_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698