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" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 ++g_next_isolated_world_id; | 44 ++g_next_isolated_world_id; |
45 | 45 |
46 // This map will tend to pile up over time, but realistically, you're never | 46 // This map will tend to pile up over time, but realistically, you're never |
47 // going to have enough extensions for it to matter. | 47 // going to have enough extensions for it to matter. |
48 g_isolated_world_ids[extension_id] = new_id; | 48 g_isolated_world_ids[extension_id] = new_id; |
49 return new_id; | 49 return new_id; |
50 } | 50 } |
51 | 51 |
52 UserScriptSlave::UserScriptSlave() | 52 UserScriptSlave::UserScriptSlave() |
53 : shared_memory_(NULL), | 53 : shared_memory_(NULL), |
54 script_deleter_(&scripts_), | 54 script_deleter_(&scripts_) { |
55 user_script_start_line_(0) { | |
56 api_js_ = ResourceBundle::GetSharedInstance().GetRawDataResource( | 55 api_js_ = ResourceBundle::GetSharedInstance().GetRawDataResource( |
57 IDR_GREASEMONKEY_API_JS); | 56 IDR_GREASEMONKEY_API_JS); |
58 | |
59 // Count the number of lines that will be injected before the user script. | |
60 base::StringPiece::size_type pos = 0; | |
61 while ((pos = api_js_.find('\n', pos)) != base::StringPiece::npos) { | |
62 user_script_start_line_++; | |
63 pos++; | |
64 } | |
65 | |
66 // NOTE: There is actually one extra line in the injected script because the | |
67 // function header includes a newline as well. But WebKit expects the | |
68 // numbering to be one-based, not zero-based, so actually *not* accounting for | |
69 // this extra line ends us up with the right offset. | |
70 } | 57 } |
71 | 58 |
72 bool UserScriptSlave::UpdateScripts(base::SharedMemoryHandle shared_memory) { | 59 bool UserScriptSlave::UpdateScripts(base::SharedMemoryHandle shared_memory) { |
73 scripts_.clear(); | 60 scripts_.clear(); |
74 | 61 |
75 // Create the shared memory object (read only). | 62 // Create the shared memory object (read only). |
76 shared_memory_.reset(new base::SharedMemory(shared_memory, true)); | 63 shared_memory_.reset(new base::SharedMemory(shared_memory, true)); |
77 if (!shared_memory_.get()) | 64 if (!shared_memory_.get()) |
78 return false; | 65 return false; |
79 | 66 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 content += kUserScriptTail; | 158 content += kUserScriptTail; |
172 } | 159 } |
173 sources.push_back( | 160 sources.push_back( |
174 WebScriptSource(WebString::fromUTF8(content), file.url())); | 161 WebScriptSource(WebString::fromUTF8(content), file.url())); |
175 } | 162 } |
176 } | 163 } |
177 | 164 |
178 if (!sources.empty()) { | 165 if (!sources.empty()) { |
179 int isolated_world_id = 0; | 166 int isolated_world_id = 0; |
180 | 167 |
181 if (script->is_standalone()) { | 168 // Emulate Greasemonkey API for scripts that were converted to extensions |
182 // For standalone scripts, we try to emulate the Greasemonkey API. | 169 // and "standalone" user scripts. |
| 170 if (script->is_standalone() || script->emulate_greasemonkey()) { |
183 sources.insert(sources.begin(), | 171 sources.insert(sources.begin(), |
184 WebScriptSource(WebString::fromUTF8(api_js_.as_string()))); | 172 WebScriptSource(WebString::fromUTF8(api_js_.as_string()))); |
185 } else { | 173 } |
186 // Setup chrome.self to contain an Extension object with the correct | 174 |
187 // ID. | 175 // Setup chrome.self to contain an Extension object with the correct |
| 176 // ID. |
| 177 if (!script->extension_id().empty()) { |
188 InsertInitExtensionCode(&sources, script->extension_id()); | 178 InsertInitExtensionCode(&sources, script->extension_id()); |
189 isolated_world_id = GetIsolatedWorldId(script->extension_id()); | 179 isolated_world_id = GetIsolatedWorldId(script->extension_id()); |
190 } | 180 } |
191 | 181 |
192 frame->executeScriptInIsolatedWorld( | 182 frame->executeScriptInIsolatedWorld( |
193 isolated_world_id, &sources.front(), sources.size(), | 183 isolated_world_id, &sources.front(), sources.size(), |
194 EXTENSION_GROUP_CONTENT_SCRIPTS); | 184 EXTENSION_GROUP_CONTENT_SCRIPTS); |
195 } | 185 } |
196 } | 186 } |
197 | 187 |
198 // Log debug info. | 188 // Log debug info. |
199 if (location == UserScript::DOCUMENT_START) { | 189 if (location == UserScript::DOCUMENT_START) { |
200 UMA_HISTOGRAM_COUNTS_100("Extensions.InjectStart_CssCount", num_css); | 190 UMA_HISTOGRAM_COUNTS_100("Extensions.InjectStart_CssCount", num_css); |
201 UMA_HISTOGRAM_COUNTS_100("Extensions.InjectStart_ScriptCount", num_scripts); | 191 UMA_HISTOGRAM_COUNTS_100("Extensions.InjectStart_ScriptCount", num_scripts); |
202 UMA_HISTOGRAM_TIMES("Extensions.InjectStart_Time", timer.Elapsed()); | 192 UMA_HISTOGRAM_TIMES("Extensions.InjectStart_Time", timer.Elapsed()); |
203 } else { | 193 } else { |
204 UMA_HISTOGRAM_COUNTS_100("Extensions.InjectEnd_ScriptCount", num_scripts); | 194 UMA_HISTOGRAM_COUNTS_100("Extensions.InjectEnd_ScriptCount", num_scripts); |
205 UMA_HISTOGRAM_TIMES("Extensions.InjectEnd_Time", timer.Elapsed()); | 195 UMA_HISTOGRAM_TIMES("Extensions.InjectEnd_Time", timer.Elapsed()); |
206 } | 196 } |
207 | 197 |
208 LOG(INFO) << "Injected " << num_scripts << " scripts and " << num_css << | 198 LOG(INFO) << "Injected " << num_scripts << " scripts and " << num_css << |
209 "css files into " << frame->url().spec().data(); | 199 "css files into " << frame->url().spec().data(); |
210 return true; | 200 return true; |
211 } | 201 } |
OLD | NEW |