1a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// found in the LICENSE file. 4a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 5a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/browser/extensions/api/execute_code_function.h" 6a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 7a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/browser/extensions/api/tabs/tabs_constants.h" 83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/extensions/image_loader.h" 9a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/browser/extensions/script_executor.h" 10a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/common/extensions/api/i18n/default_locale_handler.h" 11a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/common/extensions/extension_file_util.h" 12a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/common/extensions/extension_messages.h" 13a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/common/extensions/message_bundle.h" 14a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "extensions/browser/file_reader.h" 15a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "extensions/common/error_utils.h" 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/base/net_util.h" 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 18a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 19a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace extensions { 20a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 21a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace keys = tabs_constants; 22a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)using api::tabs::InjectDetails; 23a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 24a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)ExecuteCodeFunction::ExecuteCodeFunction() { 25a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 26a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 27a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)ExecuteCodeFunction::~ExecuteCodeFunction() { 28a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 29a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 30a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void ExecuteCodeFunction::DidLoadFile(bool success, 31a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::string& data) { 32a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!success || !details_->file) { 34a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DidLoadAndLocalizeFile(success, data); 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ScriptExecutor::ScriptType script_type = 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ShouldInsertCSS() ? ScriptExecutor::CSS : ScriptExecutor::JAVASCRIPT; 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string extension_id; 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath extension_path; 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string extension_default_locale; 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const Extension* extension = GetExtension(); 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (extension) { 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extension_id = extension->id(); 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extension_path = extension->path(); 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extension_default_locale = LocaleInfo::GetDefaultLocale(extension); 49a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::BrowserThread::PostTask( 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::BrowserThread::FILE, FROM_HERE, 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&ExecuteCodeFunction::GetFileURLAndLocalizeCSS, this, 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) script_type, 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) data, 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extension_id, 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extension_path, 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extension_default_locale)); 59a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 60a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ExecuteCodeFunction::GetFileURLAndLocalizeCSS( 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ScriptExecutor::ScriptType script_type, 63a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::string& data, 64a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::string& extension_id, 65a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const base::FilePath& extension_path, 66a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::string& extension_default_locale) { 67a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string localized_data = data; 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Check if the file is CSS and needs localization. 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if ((script_type == ScriptExecutor::CSS) && 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) !extension_id.empty() && 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) (data.find(MessageBundle::kMessageBegin) != std::string::npos)) { 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<SubstitutionMap> localization_messages( 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extension_file_util::LoadMessageBundleSubstitutionMap( 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extension_path, extension_id, extension_default_locale)); 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // We need to do message replacement on the data, so it has to be mutable. 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string error; 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MessageBundle::ReplaceMessagesWithExternalDictionary(*localization_messages, 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &localized_data, 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &error); 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_url_ = net::FilePathToFileURL(resource_.GetFilePath()); 85a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 86a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Call back DidLoadAndLocalizeFile on the UI thread. The success parameter 87a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // is always true, because if loading had failed, we wouldn't have had 88a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // anything to localize. 89a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) content::BrowserThread::PostTask( 90a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) content::BrowserThread::UI, FROM_HERE, 91a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::Bind(&ExecuteCodeFunction::DidLoadAndLocalizeFile, this, 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) true, localized_data)); 93a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 94a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 95a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void ExecuteCodeFunction::DidLoadAndLocalizeFile(bool success, 96a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::string& data) { 97a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (success) { 98a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!Execute(data)) 99a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) SendResponse(false); 100a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } else { 101a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // TODO(viettrungluu): bug: there's no particular reason the path should be 102a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // UTF-8, in which case this may fail. 103a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) error_ = ErrorUtils::FormatErrorMessage(keys::kLoadFileError, 104a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) resource_.relative_path().AsUTF8Unsafe()); 105a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) SendResponse(false); 106a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 107a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 108a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 109a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool ExecuteCodeFunction::Execute(const std::string& code_string) { 110a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ScriptExecutor* executor = GetScriptExecutor(); 111a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!executor) 112a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return false; 113a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 114a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const Extension* extension = GetExtension(); 115a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!extension) 116a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return false; 117a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 118a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ScriptExecutor::ScriptType script_type = ScriptExecutor::JAVASCRIPT; 119a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (ShouldInsertCSS()) 120a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) script_type = ScriptExecutor::CSS; 121a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ScriptExecutor::FrameScope frame_scope = 123a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) details_->all_frames.get() && *details_->all_frames ? 124a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ScriptExecutor::ALL_FRAMES : 125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ScriptExecutor::TOP_FRAME; 126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 127a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) UserScript::RunLocation run_at = 128a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) UserScript::UNDEFINED; 129a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) switch (details_->run_at) { 130a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case InjectDetails::RUN_AT_NONE: 131a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case InjectDetails::RUN_AT_DOCUMENT_IDLE: 132a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) run_at = UserScript::DOCUMENT_IDLE; 133a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 134a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case InjectDetails::RUN_AT_DOCUMENT_START: 135a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) run_at = UserScript::DOCUMENT_START; 136a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 137a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case InjectDetails::RUN_AT_DOCUMENT_END: 138a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) run_at = UserScript::DOCUMENT_END; 139a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) break; 140a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 141a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) CHECK_NE(UserScript::UNDEFINED, run_at); 142a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 143a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) executor->ExecuteScript( 144a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) extension->id(), 145a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) script_type, 146a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) code_string, 147a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) frame_scope, 148a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) run_at, 149a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ScriptExecutor::ISOLATED_WORLD, 150424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) IsWebView() ? ScriptExecutor::WEB_VIEW_PROCESS 151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) : ScriptExecutor::DEFAULT_PROCESS, 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_url_, 153424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) has_callback() ? ScriptExecutor::JSON_SERIALIZED_RESULT 154424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) : ScriptExecutor::NO_RESULT, 155a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::Bind(&ExecuteCodeFunction::OnExecuteCodeFinished, this)); 156a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return true; 157a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 158a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 159a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool ExecuteCodeFunction::HasPermission() { 160a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return true; 161a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 162a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 163a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool ExecuteCodeFunction::RunImpl() { 164a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(Init()); 165a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 166a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!details_->code.get() && !details_->file.get()) { 167a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) error_ = keys::kNoCodeOrFileToExecuteError; 168a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return false; 169a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 170a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (details_->code.get() && details_->file.get()) { 171a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) error_ = keys::kMoreThanOneValuesError; 172a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return false; 173a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 174a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 175a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!CanExecuteScriptOnPage()) 176a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return false; 177a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 178a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (details_->code.get()) 179a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return Execute(*details_->code); 180a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 181a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!details_->file.get()) 182a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return false; 183a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) resource_ = GetExtension()->GetResource(*details_->file); 184a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 185a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (resource_.extension_root().empty() || resource_.relative_path().empty()) { 186a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) error_ = keys::kNoCodeOrFileToExecuteError; 187a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return false; 188a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 189a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int resource_id; 1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (ImageLoader::IsComponentExtensionResource( 1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) resource_.extension_root(), resource_.relative_path(), 1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &resource_id)) { 1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DidLoadFile(true, rb.GetRawDataResource(resource_id).as_string()); 1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else { 1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<FileReader> file_reader(new FileReader( 1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) resource_, base::Bind(&ExecuteCodeFunction::DidLoadFile, this))); 1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) file_reader->Start(); 2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 201a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 202a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return true; 203a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 204a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 205a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void ExecuteCodeFunction::OnExecuteCodeFinished( 206a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::string& error, 207a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) int32 on_page_id, 208a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const GURL& on_url, 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::ListValue& result) { 210a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!error.empty()) 211a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) SetError(error); 212a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 213a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) SendResponse(error.empty()); 214a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 215a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 216a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} // namespace extensions 217