| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/browser/extensions/execute_code_in_tab_function.h" | 5 #include "chrome/browser/extensions/execute_code_in_tab_function.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "chrome/browser/extensions/extension_service.h" | 10 #include "chrome/browser/extensions/extension_service.h" |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 &browser, NULL, &contents, NULL)) { | 83 &browser, NULL, &contents, NULL)) { |
| 84 return false; | 84 return false; |
| 85 } | 85 } |
| 86 } | 86 } |
| 87 | 87 |
| 88 // NOTE: This can give the wrong answer due to race conditions, but it is OK, | 88 // NOTE: This can give the wrong answer due to race conditions, but it is OK, |
| 89 // we check again in the renderer. | 89 // we check again in the renderer. |
| 90 CHECK(browser); | 90 CHECK(browser); |
| 91 CHECK(contents); | 91 CHECK(contents); |
| 92 if (!GetExtension()->CanExecuteScriptOnPage( | 92 if (!GetExtension()->CanExecuteScriptOnPage( |
| 93 contents->web_contents()->GetURL(), NULL, &error_)) { | 93 contents->web_contents()->GetURL(), execute_tab_id_, NULL, &error_)) { |
| 94 return false; | 94 return false; |
| 95 } | 95 } |
| 96 | 96 |
| 97 if (script_info->HasKey(keys::kAllFramesKey)) { | 97 if (script_info->HasKey(keys::kAllFramesKey)) { |
| 98 if (!script_info->GetBoolean(keys::kAllFramesKey, &all_frames_)) | 98 if (!script_info->GetBoolean(keys::kAllFramesKey, &all_frames_)) |
| 99 return false; | 99 return false; |
| 100 } | 100 } |
| 101 | 101 |
| 102 if (script_info->HasKey(keys::kRunAtKey)) { | 102 if (script_info->HasKey(keys::kRunAtKey)) { |
| 103 std::string run_string; | 103 std::string run_string; |
| 104 EXTENSION_FUNCTION_VALIDATE(script_info->GetString( | 104 EXTENSION_FUNCTION_VALIDATE(script_info->GetString( |
| 105 keys::kRunAtKey, &run_string)); | 105 keys::kRunAtKey, &run_string)); |
| 106 | 106 |
| 107 if (run_string == extension_manifest_values::kRunAtDocumentStart) | 107 if (run_string == extension_manifest_values::kRunAtDocumentStart) |
| 108 run_at_ = UserScript::DOCUMENT_START; | 108 run_at_ = UserScript::DOCUMENT_START; |
| 109 else if (run_string == extension_manifest_values::kRunAtDocumentEnd) | 109 else if (run_string == extension_manifest_values::kRunAtDocumentEnd) |
| 110 run_at_ = UserScript::DOCUMENT_END; | 110 run_at_ = UserScript::DOCUMENT_END; |
| 111 else if (run_string == extension_manifest_values::kRunAtDocumentIdle) | 111 else if (run_string == extension_manifest_values::kRunAtDocumentIdle) |
| 112 run_at_ = UserScript::DOCUMENT_IDLE; | 112 run_at_ = UserScript::DOCUMENT_IDLE; |
| 113 else | 113 else |
| 114 EXTENSION_FUNCTION_VALIDATE(false); | 114 EXTENSION_FUNCTION_VALIDATE(false); |
| 115 } | 115 } |
| 116 | 116 |
| 117 std::string code_string; | 117 std::string code_string; |
| 118 if (script_info->HasKey(keys::kCodeKey)) { | 118 if (script_info->HasKey(keys::kCodeKey)) { |
| 119 if (!script_info->GetString(keys::kCodeKey, &code_string)) | 119 if (!script_info->GetString(keys::kCodeKey, &code_string)) |
| 120 return false; | 120 return false; |
| 121 } | 121 } |
| 122 | 122 |
| 123 if (!code_string.empty()) { | 123 if (!code_string.empty()) |
| 124 if (!Execute(code_string)) | 124 return Execute(code_string); |
| 125 return false; | |
| 126 return true; | |
| 127 } | |
| 128 | 125 |
| 129 std::string relative_path; | 126 std::string relative_path; |
| 130 if (script_info->HasKey(keys::kFileKey)) { | 127 if (script_info->HasKey(keys::kFileKey)) { |
| 131 if (!script_info->GetString(keys::kFileKey, &relative_path)) | 128 if (!script_info->GetString(keys::kFileKey, &relative_path)) |
| 132 return false; | 129 return false; |
| 133 resource_ = GetExtension()->GetResource(relative_path); | 130 resource_ = GetExtension()->GetResource(relative_path); |
| 134 } | 131 } |
| 135 if (resource_.extension_root().empty() || resource_.relative_path().empty()) { | 132 if (resource_.extension_root().empty() || resource_.relative_path().empty()) { |
| 136 error_ = keys::kNoCodeOrFileToExecuteError; | 133 error_ = keys::kNoCodeOrFileToExecuteError; |
| 137 return false; | 134 return false; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 // anything to localize. | 194 // anything to localize. |
| 198 BrowserThread::PostTask( | 195 BrowserThread::PostTask( |
| 199 BrowserThread::UI, FROM_HERE, | 196 BrowserThread::UI, FROM_HERE, |
| 200 base::Bind(&ExecuteCodeInTabFunction::DidLoadAndLocalizeFile, this, | 197 base::Bind(&ExecuteCodeInTabFunction::DidLoadAndLocalizeFile, this, |
| 201 true, css_data)); | 198 true, css_data)); |
| 202 } | 199 } |
| 203 | 200 |
| 204 void ExecuteCodeInTabFunction::DidLoadAndLocalizeFile(bool success, | 201 void ExecuteCodeInTabFunction::DidLoadAndLocalizeFile(bool success, |
| 205 const std::string& data) { | 202 const std::string& data) { |
| 206 if (success) { | 203 if (success) { |
| 207 Execute(data); | 204 if (!Execute(data)) |
| 205 SendResponse(false); |
| 208 } else { | 206 } else { |
| 209 #if defined(OS_POSIX) | 207 #if defined(OS_POSIX) |
| 210 // TODO(viettrungluu): bug: there's no particular reason the path should be | 208 // TODO(viettrungluu): bug: there's no particular reason the path should be |
| 211 // UTF-8, in which case this may fail. | 209 // UTF-8, in which case this may fail. |
| 212 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kLoadFileError, | 210 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kLoadFileError, |
| 213 resource_.relative_path().value()); | 211 resource_.relative_path().value()); |
| 214 #elif defined(OS_WIN) | 212 #elif defined(OS_WIN) |
| 215 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kLoadFileError, | 213 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kLoadFileError, |
| 216 WideToUTF8(resource_.relative_path().value())); | 214 WideToUTF8(resource_.relative_path().value())); |
| 217 #endif // OS_WIN | 215 #endif // OS_WIN |
| 218 SendResponse(false); | 216 SendResponse(false); |
| 219 } | 217 } |
| 220 } | 218 } |
| 221 | 219 |
| 222 bool ExecuteCodeInTabFunction::Execute(const std::string& code_string) { | 220 bool ExecuteCodeInTabFunction::Execute(const std::string& code_string) { |
| 223 TabContentsWrapper* contents = NULL; | 221 TabContentsWrapper* contents = NULL; |
| 224 Browser* browser = NULL; | 222 Browser* browser = NULL; |
| 225 | 223 |
| 226 bool success = ExtensionTabUtil::GetTabById( | 224 bool success = ExtensionTabUtil::GetTabById( |
| 227 execute_tab_id_, profile(), include_incognito(), &browser, NULL, | 225 execute_tab_id_, profile(), include_incognito(), &browser, NULL, |
| 228 &contents, NULL) && contents && browser; | 226 &contents, NULL) && contents && browser; |
| 229 | 227 |
| 230 if (!success) { | 228 if (!success) |
| 231 SendResponse(false); | |
| 232 return false; | 229 return false; |
| 233 } | |
| 234 | 230 |
| 235 const extensions::Extension* extension = GetExtension(); | 231 const extensions::Extension* extension = GetExtension(); |
| 236 if (!extension) { | 232 if (!extension) |
| 237 SendResponse(false); | |
| 238 return false; | 233 return false; |
| 239 } | |
| 240 | 234 |
| 241 ScriptExecutor::ScriptType script_type = ScriptExecutor::JAVASCRIPT; | 235 ScriptExecutor::ScriptType script_type = ScriptExecutor::JAVASCRIPT; |
| 242 std::string function_name = name(); | 236 std::string function_name = name(); |
| 243 if (function_name == TabsInsertCSSFunction::function_name()) { | 237 if (function_name == TabsInsertCSSFunction::function_name()) { |
| 244 script_type = ScriptExecutor::CSS; | 238 script_type = ScriptExecutor::CSS; |
| 245 } else if (function_name != TabsExecuteScriptFunction::function_name()) { | 239 } else if (function_name != TabsExecuteScriptFunction::function_name()) { |
| 246 NOTREACHED(); | 240 NOTREACHED(); |
| 247 } | 241 } |
| 248 | 242 |
| 249 contents->extension_tab_helper()->script_executor()->ExecuteScript( | 243 contents->extension_tab_helper()->script_executor()->ExecuteScript( |
| 250 extension->id(), | 244 extension->id(), |
| 251 script_type, | 245 script_type, |
| 252 code_string, | 246 code_string, |
| 253 all_frames_ ? ScriptExecutor::ALL_FRAMES : ScriptExecutor::TOP_FRAME, | 247 all_frames_ ? ScriptExecutor::ALL_FRAMES : ScriptExecutor::TOP_FRAME, |
| 254 run_at_, | 248 run_at_, |
| 255 ScriptExecutor::ISOLATED_WORLD, | 249 ScriptExecutor::ISOLATED_WORLD, |
| 256 base::Bind(&ExecuteCodeInTabFunction::OnExecuteCodeFinished, this)); | 250 base::Bind(&ExecuteCodeInTabFunction::OnExecuteCodeFinished, this)); |
| 257 return true; | 251 return true; |
| 258 } | 252 } |
| OLD | NEW |