| OLD | NEW | 
|---|
| 1 // Copyright (c) 2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2008 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 "base/logging.h" | 7 #include "base/logging.h" | 
| 8 #include "base/pickle.h" | 8 #include "base/pickle.h" | 
| 9 #include "base/shared_memory.h" | 9 #include "base/shared_memory.h" | 
|  | 10 #include "chrome/common/resource_bundle.h" | 
|  | 11 #include "chrome/renderer/renderer_resources.h" | 
| 10 #include "googleurl/src/gurl.h" | 12 #include "googleurl/src/gurl.h" | 
| 11 | 13 | 
|  | 14 // These two strings are injected before and after the Greasemonkey API and | 
|  | 15 // user script to wrap it in an anonymous scope. | 
|  | 16 static const char kUserScriptHead[] = "(function (unsafeWindow) {"; | 
|  | 17 static const char kUserScriptTail[] = "\n})(window);"; | 
| 12 | 18 | 
| 13 // UserScript | 19 // UserScript | 
| 14 | 20 | 
| 15 void UserScript::Parse(const StringPiece& script_text) { | 21 void UserScript::Parse(const StringPiece& script_text) { | 
| 16   ParseMetadata(script_text); | 22   ParseMetadata(script_text); | 
| 17 | 23 | 
| 18   // TODO(aa): Set body to just the part after the metadata block? This would | 24   // TODO(aa): Set body to just the part after the metadata block? This would | 
| 19   // significantly cut down on the size of the injected script in some cases. | 25   // significantly cut down on the size of the injected script in some cases. | 
| 20   // Would require remembering the line number the body begins at, for correct | 26   // Would require remembering the line number the body begins at, for correct | 
| 21   // error line number reporting. | 27   // error line number reporting. | 
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 103       default: | 109       default: | 
| 104         output_pattern += input_pattern[i]; | 110         output_pattern += input_pattern[i]; | 
| 105     } | 111     } | 
| 106   } | 112   } | 
| 107 | 113 | 
| 108   return output_pattern; | 114   return output_pattern; | 
| 109 } | 115 } | 
| 110 | 116 | 
| 111 | 117 | 
| 112 // UserScriptSlave | 118 // UserScriptSlave | 
| 113 UserScriptSlave::UserScriptSlave() : shared_memory_(NULL) { | 119 UserScriptSlave::UserScriptSlave() | 
|  | 120     : shared_memory_(NULL), | 
|  | 121       user_script_start_line_(0) { | 
|  | 122   // TODO: Only windows supports resources and only windows supports user | 
|  | 123   // scrips, so only load the Greasemonkey API on windows.  Fix this when | 
|  | 124   // better cross platofrm support is available. | 
|  | 125 #if defined(OS_WIN) | 
|  | 126   api_js_ = ResourceBundle::GetSharedInstance().GetRawDataResource( | 
|  | 127                 IDR_GREASEMONKEY_API_JS); | 
|  | 128 #endif | 
|  | 129 | 
|  | 130   // Count the number of lines that will be injected before the user script. | 
|  | 131   StringPiece::size_type pos = 0; | 
|  | 132   while ((pos = api_js_.find('\n', pos)) != StringPiece::npos) { | 
|  | 133     user_script_start_line_++; | 
|  | 134     pos++; | 
|  | 135   } | 
|  | 136 | 
|  | 137   // Add one more line to account for the function that wraps everything. | 
|  | 138   user_script_start_line_++; | 
| 114 } | 139 } | 
| 115 | 140 | 
| 116 bool UserScriptSlave::UpdateScripts(base::SharedMemoryHandle shared_memory) { | 141 bool UserScriptSlave::UpdateScripts(base::SharedMemoryHandle shared_memory) { | 
| 117   scripts_.clear(); | 142   scripts_.clear(); | 
| 118 | 143 | 
| 119   // Create the shared memory object (read only). | 144   // Create the shared memory object (read only). | 
| 120   shared_memory_.reset(new base::SharedMemory(shared_memory, true)); | 145   shared_memory_.reset(new base::SharedMemory(shared_memory, true)); | 
| 121   if (!shared_memory_.get()) | 146   if (!shared_memory_.get()) | 
| 122     return false; | 147     return false; | 
| 123 | 148 | 
| (...skipping 30 matching lines...) Expand all  Loading... | 
| 154     script.Parse(StringPiece(body, body_length)); | 179     script.Parse(StringPiece(body, body_length)); | 
| 155   } | 180   } | 
| 156 | 181 | 
| 157   return true; | 182   return true; | 
| 158 } | 183 } | 
| 159 | 184 | 
| 160 bool UserScriptSlave::InjectScripts(WebFrame* frame) { | 185 bool UserScriptSlave::InjectScripts(WebFrame* frame) { | 
| 161   for (std::vector<UserScript>::iterator script = scripts_.begin(); | 186   for (std::vector<UserScript>::iterator script = scripts_.begin(); | 
| 162        script != scripts_.end(); ++script) { | 187        script != scripts_.end(); ++script) { | 
| 163     if (script->MatchesUrl(frame->GetURL())) { | 188     if (script->MatchesUrl(frame->GetURL())) { | 
| 164       frame->ExecuteJavaScript(script->GetBody().as_string(), | 189       std::string inject(kUserScriptHead); | 
| 165                                GURL(script->GetURL().as_string())); | 190       inject.append(api_js_.as_string()); | 
|  | 191       inject.append(script->GetBody().as_string()); | 
|  | 192       inject.append(kUserScriptTail); | 
|  | 193       frame->ExecuteJavaScript(inject, | 
|  | 194                                GURL(script->GetURL().as_string()), | 
|  | 195                                -user_script_start_line_); | 
| 166     } | 196     } | 
| 167   } | 197   } | 
| 168 | 198 | 
| 169   return true; | 199   return true; | 
| 170 } | 200 } | 
| OLD | NEW | 
|---|