| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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/renderer/user_script_slave.h" | 5 #include "chrome/renderer/user_script_slave.h" |
| 6 | 6 |
| 7 #include "app/resource_bundle.h" | 7 #include "app/resource_bundle.h" |
| 8 #include "base/histogram.h" | 8 #include "base/histogram.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/perftimer.h" | 10 #include "base/perftimer.h" |
| 11 #include "base/pickle.h" | 11 #include "base/pickle.h" |
| 12 #include "base/shared_memory.h" | 12 #include "base/shared_memory.h" |
| 13 #include "base/string_util.h" | 13 #include "base/string_util.h" |
| 14 #include "chrome/renderer/extension_groups.h" | 14 #include "chrome/renderer/extension_groups.h" |
| 15 #include "googleurl/src/gurl.h" | 15 #include "googleurl/src/gurl.h" |
| 16 #include "webkit/api/public/WebFrame.h" | 16 #include "webkit/api/public/WebFrame.h" |
| 17 #include "webkit/api/public/WebScriptSource.h" | |
| 18 | 17 |
| 19 #include "grit/renderer_resources.h" | 18 #include "grit/renderer_resources.h" |
| 20 | 19 |
| 21 using WebKit::WebFrame; | 20 using WebKit::WebFrame; |
| 22 using WebKit::WebScriptSource; | |
| 23 using WebKit::WebString; | 21 using WebKit::WebString; |
| 24 | 22 |
| 25 // These two strings are injected before and after the Greasemonkey API and | 23 // These two strings are injected before and after the Greasemonkey API and |
| 26 // user script to wrap it in an anonymous scope. | 24 // user script to wrap it in an anonymous scope. |
| 27 static const char kUserScriptHead[] = "(function (unsafeWindow) {\n"; | 25 static const char kUserScriptHead[] = "(function (unsafeWindow) {\n"; |
| 28 static const char kUserScriptTail[] = "\n})(window);"; | 26 static const char kUserScriptTail[] = "\n})(window);"; |
| 29 | 27 |
| 30 // Creates a convenient reference to a content script's parent extension. | 28 // Creates a convenient reference to a content script's parent extension. |
| 31 // TODO(mpcomplete): self.onConnect is deprecated. Remove it at 1.0. | 29 // TODO(mpcomplete): self.onConnect is deprecated. Remove it at 1.0. |
| 32 // http://code.google.com/p/chromium/issues/detail?id=16356 | 30 // http://code.google.com/p/chromium/issues/detail?id=16356 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 int body_length = 0; | 100 int body_length = 0; |
| 103 CHECK(pickle.ReadData(&iter, &body, &body_length)); | 101 CHECK(pickle.ReadData(&iter, &body, &body_length)); |
| 104 script->css_scripts()[j].set_external_content( | 102 script->css_scripts()[j].set_external_content( |
| 105 base::StringPiece(body, body_length)); | 103 base::StringPiece(body, body_length)); |
| 106 } | 104 } |
| 107 } | 105 } |
| 108 | 106 |
| 109 return true; | 107 return true; |
| 110 } | 108 } |
| 111 | 109 |
| 110 // static |
| 111 void UserScriptSlave::InsertInitExtensionCode( |
| 112 std::vector<WebScriptSource>* sources, const std::string& extension_id) { |
| 113 DCHECK(sources); |
| 114 sources->insert(sources->begin(), |
| 115 WebScriptSource(WebString::fromUTF8( |
| 116 StringPrintf(kInitExtension, extension_id.c_str())))); |
| 117 } |
| 118 |
| 112 bool UserScriptSlave::InjectScripts(WebFrame* frame, | 119 bool UserScriptSlave::InjectScripts(WebFrame* frame, |
| 113 UserScript::RunLocation location) { | 120 UserScript::RunLocation location) { |
| 114 // Don't bother if this is not a URL we inject script into. | 121 // Don't bother if this is not a URL we inject script into. |
| 115 if (!URLPattern::IsValidScheme(GURL(frame->url()).scheme())) | 122 if (!URLPattern::IsValidScheme(GURL(frame->url()).scheme())) |
| 116 return true; | 123 return true; |
| 117 | 124 |
| 118 PerfTimer timer; | 125 PerfTimer timer; |
| 119 int num_matched = 0; | 126 int num_matched = 0; |
| 120 | 127 |
| 121 for (size_t i = 0; i < scripts_.size(); ++i) { | 128 for (size_t i = 0; i < scripts_.size(); ++i) { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 150 } | 157 } |
| 151 | 158 |
| 152 if (!sources.empty()) { | 159 if (!sources.empty()) { |
| 153 if (script->is_standalone()) { | 160 if (script->is_standalone()) { |
| 154 // For standalone scripts, we try to emulate the Greasemonkey API. | 161 // For standalone scripts, we try to emulate the Greasemonkey API. |
| 155 sources.insert(sources.begin(), | 162 sources.insert(sources.begin(), |
| 156 WebScriptSource(WebString::fromUTF8(api_js_.as_string()))); | 163 WebScriptSource(WebString::fromUTF8(api_js_.as_string()))); |
| 157 } else { | 164 } else { |
| 158 // Setup chrome.self to contain an Extension object with the correct | 165 // Setup chrome.self to contain an Extension object with the correct |
| 159 // ID. | 166 // ID. |
| 160 sources.insert(sources.begin(), | 167 InsertInitExtensionCode(&sources, script->extension_id()); |
| 161 WebScriptSource(WebString::fromUTF8( | |
| 162 StringPrintf(kInitExtension, script->extension_id().c_str())))); | |
| 163 } | 168 } |
| 164 | 169 |
| 165 frame->executeScriptInNewWorld(&sources.front(), sources.size(), | 170 frame->executeScriptInNewWorld(&sources.front(), sources.size(), |
| 166 EXTENSION_GROUP_CONTENT_SCRIPTS); | 171 EXTENSION_GROUP_CONTENT_SCRIPTS); |
| 167 } | 172 } |
| 168 } | 173 } |
| 169 | 174 |
| 170 // Log debug info. | 175 // Log debug info. |
| 171 if (location == UserScript::DOCUMENT_START) { | 176 if (location == UserScript::DOCUMENT_START) { |
| 172 HISTOGRAM_COUNTS_100("UserScripts:DocStart:Count", num_matched); | 177 HISTOGRAM_COUNTS_100("UserScripts:DocStart:Count", num_matched); |
| 173 HISTOGRAM_TIMES("UserScripts:DocStart:Time", timer.Elapsed()); | 178 HISTOGRAM_TIMES("UserScripts:DocStart:Time", timer.Elapsed()); |
| 174 } else { | 179 } else { |
| 175 HISTOGRAM_COUNTS_100("UserScripts:DocEnd:Count", num_matched); | 180 HISTOGRAM_COUNTS_100("UserScripts:DocEnd:Count", num_matched); |
| 176 HISTOGRAM_TIMES("UserScripts:DocEnd:Time", timer.Elapsed()); | 181 HISTOGRAM_TIMES("UserScripts:DocEnd:Time", timer.Elapsed()); |
| 177 } | 182 } |
| 178 | 183 |
| 179 LOG(INFO) << "Injected " << num_matched << " user scripts into " << | 184 LOG(INFO) << "Injected " << num_matched << " user scripts into " << |
| 180 frame->url().spec().data(); | 185 frame->url().spec().data(); |
| 181 return true; | 186 return true; |
| 182 } | 187 } |
| OLD | NEW |