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

Side by Side Diff: extensions/renderer/user_script_slave.cc

Issue 270153004: Introduce ActiveScriptController; track active extension scripts (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 "extensions/renderer/user_script_slave.h" 5 #include "extensions/renderer/user_script_slave.h"
6 6
7 #include <map> 7 #include <map>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 if (frame->isViewSourceModeEnabled()) 187 if (frame->isViewSourceModeEnabled())
188 data_source_url = GURL(content::kViewSourceScheme + std::string(":") + 188 data_source_url = GURL(content::kViewSourceScheme + std::string(":") +
189 data_source_url.spec()); 189 data_source_url.spec());
190 190
191 base::ElapsedTimer timer; 191 base::ElapsedTimer timer;
192 int num_css = 0; 192 int num_css = 0;
193 int num_scripts = 0; 193 int num_scripts = 0;
194 194
195 ExecutingScriptsMap extensions_executing_scripts; 195 ExecutingScriptsMap extensions_executing_scripts;
196 196
197 blink::WebFrame* top_frame = frame->top();
198 content::RenderView* top_render_view =
199 content::RenderView::FromWebView(top_frame->view());
200
197 for (size_t i = 0; i < scripts_.size(); ++i) { 201 for (size_t i = 0; i < scripts_.size(); ++i) {
198 std::vector<WebScriptSource> sources; 202 std::vector<WebScriptSource> sources;
199 UserScript* script = scripts_[i]; 203 UserScript* script = scripts_[i];
200 204
201 if (frame->parent() && !script->match_all_frames()) 205 if (frame->parent() && !script->match_all_frames())
202 continue; // Only match subframes if the script declared it wanted to. 206 continue; // Only match subframes if the script declared it wanted to.
203 207
204 const Extension* extension = extensions_->GetByID(script->extension_id()); 208 const Extension* extension = extensions_->GetByID(script->extension_id());
205 209
206 // Since extension info is sent separately from user script info, they can 210 // Since extension info is sent separately from user script info, they can
207 // be out of sync. We just ignore this situation. 211 // be out of sync. We just ignore this situation.
208 if (!extension) 212 if (!extension)
209 continue; 213 continue;
210 214
211 // Content scripts are not tab-specific. 215 // Content scripts are not tab-specific.
212 const int kNoTabId = -1; 216 const int kNoTabId = -1;
213 // We don't have a process id in this context. 217 // We don't have a process id in this context.
214 const int kNoProcessId = -1; 218 const int kNoProcessId = -1;
215 if (!PermissionsData::CanExecuteScriptOnPage(extension, 219 if (!PermissionsData::CanExecuteScriptOnPage(extension,
216 data_source_url, 220 data_source_url,
217 frame->top()->document().url(), 221 top_frame->document().url(),
218 kNoTabId, 222 kNoTabId,
219 script, 223 script,
220 kNoProcessId, 224 kNoProcessId,
221 NULL)) { 225 NULL)) {
222 continue; 226 continue;
223 } 227 }
224 228
225 if (location == UserScript::DOCUMENT_START) { 229 if (location == UserScript::DOCUMENT_START) {
226 num_css += script->css_scripts().size(); 230 num_css += script->css_scripts().size();
227 for (UserScript::FileList::const_iterator iter = 231 for (UserScript::FileList::const_iterator iter =
228 script->css_scripts().begin(); 232 script->css_scripts().begin();
229 iter != script->css_scripts().end(); 233 iter != script->css_scripts().end();
230 ++iter) { 234 ++iter) {
231 frame->document().insertStyleSheet( 235 frame->document().insertStyleSheet(
232 WebString::fromUTF8(iter->GetContent().as_string())); 236 WebString::fromUTF8(iter->GetContent().as_string()));
233 } 237 }
234 } 238 }
235 239
236 if (script->run_location() == location) { 240 if (script->run_location() == location) {
241 // TODO(rdevlin.cronin): Right now, this is just a notification, but soon
242 // we should block without user consent.
243 if (PermissionsData::RequiresActionForScriptExecution(extension)) {
244 LOG(WARNING) << "Sending message";
245 top_render_view->Send(
246 new ExtensionHostMsg_NotifyExtensionScriptExecution(
247 top_render_view->GetRoutingID(),
248 extension->id(),
249 top_render_view->GetPageId()));
250 }
237 num_scripts += script->js_scripts().size(); 251 num_scripts += script->js_scripts().size();
238 for (size_t j = 0; j < script->js_scripts().size(); ++j) { 252 for (size_t j = 0; j < script->js_scripts().size(); ++j) {
239 UserScript::File& file = script->js_scripts()[j]; 253 UserScript::File& file = script->js_scripts()[j];
240 std::string content = file.GetContent().as_string(); 254 std::string content = file.GetContent().as_string();
241 255
242 // We add this dumb function wrapper for standalone user script to 256 // We add this dumb function wrapper for standalone user script to
243 // emulate what Greasemonkey does. 257 // emulate what Greasemonkey does.
244 // TODO(aa): I think that maybe "is_standalone" scripts don't exist 258 // TODO(aa): I think that maybe "is_standalone" scripts don't exist
245 // anymore. Investigate. 259 // anymore. Investigate.
246 if (script->is_standalone() || script->emulate_greasemonkey()) { 260 if (script->is_standalone() || script->emulate_greasemonkey()) {
(...skipping 28 matching lines...) Expand all
275 iter != sources.end(); 289 iter != sources.end();
276 ++iter) { 290 ++iter) {
277 extensions_executing_scripts[extension->id()].insert( 291 extensions_executing_scripts[extension->id()].insert(
278 GURL(iter->url).path()); 292 GURL(iter->url).path());
279 } 293 }
280 } 294 }
281 } 295 }
282 296
283 // Notify the browser if any extensions are now executing scripts. 297 // Notify the browser if any extensions are now executing scripts.
284 if (!extensions_executing_scripts.empty()) { 298 if (!extensions_executing_scripts.empty()) {
285 blink::WebFrame* top_frame = frame->top(); 299 top_render_view->Send(new ExtensionHostMsg_ContentScriptsExecuting(
286 content::RenderView* render_view = 300 top_render_view->GetRoutingID(),
287 content::RenderView::FromWebView(top_frame->view());
288 render_view->Send(new ExtensionHostMsg_ContentScriptsExecuting(
289 render_view->GetRoutingID(),
290 extensions_executing_scripts, 301 extensions_executing_scripts,
291 render_view->GetPageId(), 302 top_render_view->GetPageId(),
292 ScriptContext::GetDataSourceURLForFrame(top_frame))); 303 ScriptContext::GetDataSourceURLForFrame(top_frame)));
293 } 304 }
294 305
295 // Log debug info. 306 // Log debug info.
296 if (location == UserScript::DOCUMENT_START) { 307 if (location == UserScript::DOCUMENT_START) {
297 UMA_HISTOGRAM_COUNTS_100("Extensions.InjectStart_CssCount", num_css); 308 UMA_HISTOGRAM_COUNTS_100("Extensions.InjectStart_CssCount", num_css);
298 UMA_HISTOGRAM_COUNTS_100("Extensions.InjectStart_ScriptCount", num_scripts); 309 UMA_HISTOGRAM_COUNTS_100("Extensions.InjectStart_ScriptCount", num_scripts);
299 if (num_css || num_scripts) 310 if (num_css || num_scripts)
300 UMA_HISTOGRAM_TIMES("Extensions.InjectStart_Time", timer.Elapsed()); 311 UMA_HISTOGRAM_TIMES("Extensions.InjectStart_Time", timer.Elapsed());
301 } else if (location == UserScript::DOCUMENT_END) { 312 } else if (location == UserScript::DOCUMENT_END) {
302 UMA_HISTOGRAM_COUNTS_100("Extensions.InjectEnd_ScriptCount", num_scripts); 313 UMA_HISTOGRAM_COUNTS_100("Extensions.InjectEnd_ScriptCount", num_scripts);
303 if (num_scripts) 314 if (num_scripts)
304 UMA_HISTOGRAM_TIMES("Extensions.InjectEnd_Time", timer.Elapsed()); 315 UMA_HISTOGRAM_TIMES("Extensions.InjectEnd_Time", timer.Elapsed());
305 } else if (location == UserScript::DOCUMENT_IDLE) { 316 } else if (location == UserScript::DOCUMENT_IDLE) {
306 UMA_HISTOGRAM_COUNTS_100("Extensions.InjectIdle_ScriptCount", num_scripts); 317 UMA_HISTOGRAM_COUNTS_100("Extensions.InjectIdle_ScriptCount", num_scripts);
307 if (num_scripts) 318 if (num_scripts)
308 UMA_HISTOGRAM_TIMES("Extensions.InjectIdle_Time", timer.Elapsed()); 319 UMA_HISTOGRAM_TIMES("Extensions.InjectIdle_Time", timer.Elapsed());
309 } else { 320 } else {
310 NOTREACHED(); 321 NOTREACHED();
311 } 322 }
312 } 323 }
313 324
314 } // namespace extensions 325 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698