| Index: extensions/renderer/user_script_injector.cc
|
| diff --git a/extensions/renderer/user_script_injector.cc b/extensions/renderer/user_script_injector.cc
|
| index 5800edf024370586840b842deddb856933b65c09..8ae1c164cb64e2e8b8f3d268065b2871dd103e72 100644
|
| --- a/extensions/renderer/user_script_injector.cc
|
| +++ b/extensions/renderer/user_script_injector.cc
|
| @@ -44,6 +44,11 @@
|
|
|
| using RoutingInfoMap = std::map<RoutingInfoKey, bool>;
|
|
|
| +// These two strings are injected before and after the Greasemonkey API and
|
| +// user script to wrap it in an anonymous scope.
|
| +const char kUserScriptHead[] = "(function (unsafeWindow) {\n";
|
| +const char kUserScriptTail[] = "\n})(window);";
|
| +
|
| // A map records whether a given |script_id| from a webview-added user script
|
| // is allowed to inject on the render of given |routing_id|.
|
| // Once a script is added, the decision of whether or not allowed to inject
|
| @@ -86,7 +91,6 @@
|
| UserScriptSet* script_list,
|
| bool is_declarative)
|
| : script_(script),
|
| - user_script_set_(script_list),
|
| script_id_(script_->id()),
|
| host_id_(script_->host_id()),
|
| is_declarative_(is_declarative),
|
| @@ -202,19 +206,35 @@
|
| DCHECK_EQ(script_->run_location(), run_location);
|
|
|
| const UserScript::FileList& js_scripts = script_->js_scripts();
|
| - sources.reserve(js_scripts.size() +
|
| - (script_->emulate_greasemonkey() ? 1 : 0));
|
| + sources.reserve(js_scripts.size());
|
| + for (const std::unique_ptr<UserScript::File>& file : js_scripts) {
|
| + base::StringPiece script_content = file->GetContent();
|
| + blink::WebString source;
|
| + if (script_->emulate_greasemonkey()) {
|
| + // We add this dumb function wrapper for user scripts to emulate what
|
| + // Greasemonkey does. |script_content| becomes:
|
| + // concat(kUserScriptHead, script_content, kUserScriptTail).
|
| + std::string content;
|
| + content.reserve(strlen(kUserScriptHead) + script_content.length() +
|
| + strlen(kUserScriptTail));
|
| + content.append(kUserScriptHead);
|
| + script_content.AppendToString(&content);
|
| + content.append(kUserScriptTail);
|
| + // TODO(lazyboy): |content| is copied to |source|, should be avoided.
|
| + // Investigate if we can leverage WebString's cheap copying mechanism
|
| + // somehow.
|
| + source = blink::WebString::fromUTF8(content);
|
| + } else {
|
| + source = blink::WebString::fromUTF8(script_content.data(),
|
| + script_content.length());
|
| + }
|
| + sources.push_back(blink::WebScriptSource(source, file->url()));
|
| + }
|
|
|
| // Emulate Greasemonkey API for scripts that were converted to extension
|
| // user scripts.
|
| if (script_->emulate_greasemonkey())
|
| - sources.push_back(g_greasemonkey_api.Get().GetSource());
|
| -
|
| - for (const std::unique_ptr<UserScript::File>& file : js_scripts) {
|
| - sources.push_back(blink::WebScriptSource(
|
| - user_script_set_->GetJsSource(*file, script_->emulate_greasemonkey()),
|
| - file->url()));
|
| - }
|
| + sources.insert(sources.begin(), g_greasemonkey_api.Get().GetSource());
|
|
|
| return sources;
|
| }
|
| @@ -229,8 +249,14 @@
|
|
|
| const UserScript::FileList& css_scripts = script_->css_scripts();
|
| sources.reserve(css_scripts.size());
|
| - for (const std::unique_ptr<UserScript::File>& file : script_->css_scripts())
|
| - sources.push_back(user_script_set_->GetCssSource(*file));
|
| + for (const std::unique_ptr<UserScript::File>& file : script_->css_scripts()) {
|
| + // TODO(lazyboy): |css_content| string is copied into blink::WebString for
|
| + // every frame in the current renderer process. Avoid the copy, possibly by
|
| + // only performing the copy once.
|
| + base::StringPiece css_content = file->GetContent();
|
| + sources.push_back(
|
| + blink::WebString::fromUTF8(css_content.data(), css_content.length()));
|
| + }
|
| return sources;
|
| }
|
|
|
|
|