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