Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2764)

Unified Diff: chrome/browser/extensions/api/tabs/tabs_api.cc

Issue 11747025: Run the JSON Schema Compiler's bundle compilation on JSON files. Previously it (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix ms release build Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/tabs/tabs_api.cc
diff --git a/chrome/browser/extensions/api/tabs/tabs.cc b/chrome/browser/extensions/api/tabs/tabs_api.cc
similarity index 85%
rename from chrome/browser/extensions/api/tabs/tabs.cc
rename to chrome/browser/extensions/api/tabs/tabs_api.cc
index 342b6307572382bdbc0a34901e6344c6a771eb88..441f4221875776e3e7289624cdabc30fca17936f 100644
--- a/chrome/browser/extensions/api/tabs/tabs.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_api.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/extensions/api/tabs/tabs.h"
+#include "chrome/browser/extensions/api/tabs/tabs_api.h"
#include <algorithm>
#include <limits>
@@ -26,6 +26,7 @@
#include "chrome/browser/extensions/extension_host.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_tab_util.h"
+#include "chrome/browser/extensions/file_reader.h"
#include "chrome/browser/extensions/script_executor.h"
#include "chrome/browser/extensions/tab_helper.h"
#include "chrome/browser/extensions/window_controller.h"
@@ -50,10 +51,15 @@
#include "chrome/browser/web_applications/web_app.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/chrome_switches.h"
+#include "chrome/common/extensions/api/tabs.h"
#include "chrome/common/extensions/api/windows.h"
#include "chrome/common/extensions/extension.h"
+#include "chrome/common/extensions/extension_constants.h"
+#include "chrome/common/extensions/extension_file_util.h"
+#include "chrome/common/extensions/extension_l10n_util.h"
#include "chrome/common/extensions/extension_manifest_constants.h"
#include "chrome/common/extensions/extension_messages.h"
+#include "chrome/common/extensions/message_bundle.h"
#include "chrome/common/extensions/user_script.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
@@ -87,6 +93,7 @@ namespace GetLastFocused = extensions::api::windows::GetLastFocused;
namespace errors = extension_manifest_errors;
namespace keys = extensions::tabs_constants;
+using content::BrowserThread;
using content::NavigationController;
using content::NavigationEntry;
using content::OpenURLParams;
@@ -95,10 +102,12 @@ using content::RenderViewHost;
using content::WebContents;
using extensions::ErrorUtils;
using extensions::ScriptExecutor;
+using extensions::UserScript;
using extensions::WindowController;
using extensions::WindowControllerList;
+using extensions::api::tabs::InjectDetails;
-const int CaptureVisibleTabFunction::kDefaultQuality = 90;
+const int TabsCaptureVisibleTabFunction::kDefaultQuality = 90;
namespace {
@@ -249,7 +258,7 @@ Browser* CreateBrowserWindow(const Browser::CreateParams& params,
// Windows ---------------------------------------------------------------------
-bool GetWindowFunction::RunImpl() {
+bool WindowsGetFunction::RunImpl() {
scoped_ptr<Get::Params> params(Get::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
@@ -268,7 +277,7 @@ bool GetWindowFunction::RunImpl() {
return true;
}
-bool GetCurrentWindowFunction::RunImpl() {
+bool WindowsGetCurrentFunction::RunImpl() {
scoped_ptr<GetCurrent::Params> params(GetCurrent::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
@@ -289,7 +298,7 @@ bool GetCurrentWindowFunction::RunImpl() {
return true;
}
-bool GetLastFocusedWindowFunction::RunImpl() {
+bool WindowsGetLastFocusedFunction::RunImpl() {
scoped_ptr<GetLastFocused::Params> params(
GetLastFocused::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
@@ -316,7 +325,7 @@ bool GetLastFocusedWindowFunction::RunImpl() {
return true;
}
-bool GetAllWindowsFunction::RunImpl() {
+bool WindowsGetAllFunction::RunImpl() {
scoped_ptr<GetAll::Params> params(GetAll::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
@@ -341,7 +350,7 @@ bool GetAllWindowsFunction::RunImpl() {
return true;
}
-bool CreateWindowFunction::ShouldOpenIncognitoWindow(
+bool WindowsCreateFunction::ShouldOpenIncognitoWindow(
const base::DictionaryValue* args,
std::vector<GURL>* urls,
bool* is_error) {
@@ -391,7 +400,7 @@ bool CreateWindowFunction::ShouldOpenIncognitoWindow(
return incognito;
}
-bool CreateWindowFunction::RunImpl() {
+bool WindowsCreateFunction::RunImpl() {
DictionaryValue* args = NULL;
std::vector<GURL> urls;
WebContents* contents = NULL;
@@ -660,7 +669,7 @@ bool CreateWindowFunction::RunImpl() {
return true;
}
-bool UpdateWindowFunction::RunImpl() {
+bool WindowsUpdateFunction::RunImpl() {
int window_id = extension_misc::kUnknownWindowId;
EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &window_id));
DictionaryValue* update_props;
@@ -804,7 +813,7 @@ bool UpdateWindowFunction::RunImpl() {
return true;
}
-bool RemoveWindowFunction::RunImpl() {
+bool WindowsRemoveFunction::RunImpl() {
int window_id = -1;
EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &window_id));
@@ -831,7 +840,7 @@ bool RemoveWindowFunction::RunImpl() {
// Tabs ------------------------------------------------------------------------
-bool GetSelectedTabFunction::RunImpl() {
+bool TabsGetSelectedFunction::RunImpl() {
// windowId defaults to "current" window.
int window_id = extension_misc::kCurrentWindowId;
@@ -855,7 +864,7 @@ bool GetSelectedTabFunction::RunImpl() {
return true;
}
-bool GetAllTabsInWindowFunction::RunImpl() {
+bool TabsGetAllInWindowFunction::RunImpl() {
// windowId defaults to "current" window.
int window_id = extension_misc::kCurrentWindowId;
if (HasOptionalArgument(0))
@@ -870,7 +879,7 @@ bool GetAllTabsInWindowFunction::RunImpl() {
return true;
}
-bool QueryTabsFunction::RunImpl() {
+bool TabsQueryFunction::RunImpl() {
DictionaryValue* query = NULL;
EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &query));
@@ -983,7 +992,7 @@ bool QueryTabsFunction::RunImpl() {
return true;
}
-bool CreateTabFunction::RunImpl() {
+bool TabsCreateFunction::RunImpl() {
DictionaryValue* args = NULL;
EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args));
@@ -1117,7 +1126,7 @@ bool CreateTabFunction::RunImpl() {
return true;
}
-bool DuplicateTabFunction::RunImpl() {
+bool TabsDuplicateFunction::RunImpl() {
int tab_id = -1;
EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &tab_id));
@@ -1143,7 +1152,7 @@ bool DuplicateTabFunction::RunImpl() {
return true;
}
-bool GetTabFunction::RunImpl() {
+bool TabsGetFunction::RunImpl() {
int tab_id = -1;
EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &tab_id));
@@ -1161,7 +1170,7 @@ bool GetTabFunction::RunImpl() {
return true;
}
-bool GetCurrentTabFunction::RunImpl() {
+bool TabsGetCurrentFunction::RunImpl() {
DCHECK(dispatcher());
WebContents* contents = dispatcher()->delegate()->GetAssociatedWebContents();
@@ -1171,7 +1180,7 @@ bool GetCurrentTabFunction::RunImpl() {
return true;
}
-bool HighlightTabsFunction::RunImpl() {
+bool TabsHighlightFunction::RunImpl() {
DictionaryValue* info = NULL;
EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &info));
@@ -1228,10 +1237,10 @@ bool HighlightTabsFunction::RunImpl() {
return true;
}
-UpdateTabFunction::UpdateTabFunction() : web_contents_(NULL) {
+TabsUpdateFunction::TabsUpdateFunction() : web_contents_(NULL) {
}
-bool UpdateTabFunction::RunImpl() {
+bool TabsUpdateFunction::RunImpl() {
DictionaryValue* update_props = NULL;
EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &update_props));
@@ -1335,7 +1344,7 @@ bool UpdateTabFunction::RunImpl() {
return true;
}
-bool UpdateTabFunction::UpdateURLIfPresent(DictionaryValue* update_props,
+bool TabsUpdateFunction::UpdateURLIfPresent(DictionaryValue* update_props,
int tab_id,
bool* is_async) {
if (!update_props->HasKey(keys::kUrlKey))
@@ -1379,7 +1388,7 @@ bool UpdateTabFunction::UpdateURLIfPresent(DictionaryValue* update_props,
ScriptExecutor::TOP_FRAME,
extensions::UserScript::DOCUMENT_IDLE,
ScriptExecutor::MAIN_WORLD,
- base::Bind(&UpdateTabFunction::OnExecuteCodeFinished, this));
+ base::Bind(&TabsUpdateFunction::OnExecuteCodeFinished, this));
*is_async = true;
return true;
@@ -1396,14 +1405,14 @@ bool UpdateTabFunction::UpdateURLIfPresent(DictionaryValue* update_props,
return true;
}
-void UpdateTabFunction::PopulateResult() {
+void TabsUpdateFunction::PopulateResult() {
if (!has_callback())
return;
SetResult(ExtensionTabUtil::CreateTabValue(web_contents_, GetExtension()));
}
-void UpdateTabFunction::OnExecuteCodeFinished(const std::string& error,
+void TabsUpdateFunction::OnExecuteCodeFinished(const std::string& error,
int32 on_page_id,
const GURL& url,
const ListValue& script_result) {
@@ -1414,7 +1423,7 @@ void UpdateTabFunction::OnExecuteCodeFinished(const std::string& error,
SendResponse(error.empty());
}
-bool MoveTabsFunction::RunImpl() {
+bool TabsMoveFunction::RunImpl() {
Value* tab_value = NULL;
EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &tab_value));
@@ -1535,7 +1544,7 @@ bool MoveTabsFunction::RunImpl() {
return true;
}
-bool ReloadTabFunction::RunImpl() {
+bool TabsReloadFunction::RunImpl() {
bool bypass_cache = false;
if (HasOptionalArgument(1)) {
DictionaryValue* reload_props = NULL;
@@ -1590,7 +1599,7 @@ bool ReloadTabFunction::RunImpl() {
return true;
}
-bool RemoveTabsFunction::RunImpl() {
+bool TabsRemoveFunction::RunImpl() {
Value* tab_value = NULL;
EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &tab_value));
@@ -1620,7 +1629,8 @@ bool RemoveTabsFunction::RunImpl() {
return true;
}
-bool CaptureVisibleTabFunction::GetTabToCapture(WebContents** web_contents) {
+bool TabsCaptureVisibleTabFunction::GetTabToCapture(
+ WebContents** web_contents) {
Browser* browser = NULL;
// windowId defaults to "current" window.
int window_id = extension_misc::kCurrentWindowId;
@@ -1640,7 +1650,7 @@ bool CaptureVisibleTabFunction::GetTabToCapture(WebContents** web_contents) {
return true;
};
-bool CaptureVisibleTabFunction::RunImpl() {
+bool TabsCaptureVisibleTabFunction::RunImpl() {
PrefServiceBase* service = profile()->GetPrefs();
if (service->GetBoolean(prefs::kDisableScreenshots)) {
error_ = keys::kScreenshotsDisabled;
@@ -1699,14 +1709,14 @@ bool CaptureVisibleTabFunction::RunImpl() {
render_view_host->CopyFromBackingStore(
gfx::Rect(),
view->GetViewBounds().size(),
- base::Bind(&CaptureVisibleTabFunction::CopyFromBackingStoreComplete,
+ base::Bind(&TabsCaptureVisibleTabFunction::CopyFromBackingStoreComplete,
this,
base::Owned(temp_bitmap)),
temp_bitmap);
return true;
}
-void CaptureVisibleTabFunction::CopyFromBackingStoreComplete(
+void TabsCaptureVisibleTabFunction::CopyFromBackingStoreComplete(
skia::PlatformBitmap* bitmap,
bool succeeded) {
if (succeeded) {
@@ -1726,14 +1736,14 @@ void CaptureVisibleTabFunction::CopyFromBackingStoreComplete(
registrar_.Add(this,
chrome::NOTIFICATION_TAB_SNAPSHOT_TAKEN,
content::Source<WebContents>(web_contents));
- AddRef(); // Balanced in CaptureVisibleTabFunction::Observe().
+ AddRef(); // Balanced in TabsCaptureVisibleTabFunction::Observe().
SnapshotTabHelper::FromWebContents(web_contents)->CaptureSnapshot();
}
-// If a backing store was not available in CaptureVisibleTabFunction::RunImpl,
-// than the renderer was asked for a snapshot. Listen for a notification
-// that the snapshot is available.
-void CaptureVisibleTabFunction::Observe(
+// If a backing store was not available in
+// TabsCaptureVisibleTabFunction::RunImpl, than the renderer was asked for a
+// snapshot. Listen for a notification that the snapshot is available.
+void TabsCaptureVisibleTabFunction::Observe(
int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
@@ -1751,12 +1761,12 @@ void CaptureVisibleTabFunction::Observe(
SendResultFromBitmap(*screen_capture);
}
- Release(); // Balanced in CaptureVisibleTabFunction::RunImpl().
+ Release(); // Balanced in TabsCaptureVisibleTabFunction::RunImpl().
}
// Turn a bitmap of the screen into an image, set that image as the result,
// and call SendResponse().
-void CaptureVisibleTabFunction::SendResultFromBitmap(
+void TabsCaptureVisibleTabFunction::SendResultFromBitmap(
const SkBitmap& screen_capture) {
std::vector<unsigned char> data;
SkAutoLockPixels screen_capture_lock(screen_capture);
@@ -1802,13 +1812,13 @@ void CaptureVisibleTabFunction::SendResultFromBitmap(
SendResponse(true);
}
-void CaptureVisibleTabFunction::RegisterUserPrefs(
+void TabsCaptureVisibleTabFunction::RegisterUserPrefs(
PrefServiceSyncable* service) {
service->RegisterBooleanPref(prefs::kDisableScreenshots, false,
PrefServiceSyncable::UNSYNCABLE_PREF);
}
-bool DetectTabLanguageFunction::RunImpl() {
+bool TabsDetectLanguageFunction::RunImpl() {
int tab_id = 0;
Browser* browser = NULL;
WebContents* contents = NULL;
@@ -1846,7 +1856,7 @@ bool DetectTabLanguageFunction::RunImpl() {
// Delay the callback invocation until after the current JS call has
// returned.
MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
- &DetectTabLanguageFunction::GotLanguage, this,
+ &TabsDetectLanguageFunction::GotLanguage, this,
translate_tab_helper->language_state().original_language()));
return true;
}
@@ -1863,7 +1873,7 @@ bool DetectTabLanguageFunction::RunImpl() {
return true;
}
-void DetectTabLanguageFunction::Observe(
+void TabsDetectLanguageFunction::Observe(
int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
@@ -1878,9 +1888,249 @@ void DetectTabLanguageFunction::Observe(
GotLanguage(language);
}
-void DetectTabLanguageFunction::GotLanguage(const std::string& language) {
+void TabsDetectLanguageFunction::GotLanguage(const std::string& language) {
SetResult(Value::CreateStringValue(language.c_str()));
SendResponse(true);
Release(); // Balanced in Run()
}
+
+ExecuteCodeInTabFunction::ExecuteCodeInTabFunction()
+ : execute_tab_id_(-1) {
+}
+
+ExecuteCodeInTabFunction::~ExecuteCodeInTabFunction() {}
+
+bool ExecuteCodeInTabFunction::HasPermission() {
+ if (Init() &&
+ extension_->HasAPIPermissionForTab(execute_tab_id_,
+ extensions::APIPermission::kTab)) {
+ return true;
+ }
+ return ExtensionFunction::HasPermission();
+}
+
+bool ExecuteCodeInTabFunction::RunImpl() {
+ EXTENSION_FUNCTION_VALIDATE(Init());
+
+ if (!details_->code.get() && !details_->file.get()) {
+ error_ = keys::kNoCodeOrFileToExecuteError;
+ return false;
+ }
+ if (details_->code.get() && details_->file.get()) {
+ error_ = keys::kMoreThanOneValuesError;
+ return false;
+ }
+
+ content::WebContents* contents = NULL;
+
+ // If |tab_id| is specified, look for the tab. Otherwise default to selected
+ // tab in the current window.
+ CHECK_GE(execute_tab_id_, 0);
+ if (!ExtensionTabUtil::GetTabById(execute_tab_id_, profile(),
+ include_incognito(),
+ NULL, NULL, &contents, NULL)) {
+ return false;
+ }
+
+ // NOTE: This can give the wrong answer due to race conditions, but it is OK,
+ // we check again in the renderer.
+ CHECK(contents);
+ if (!GetExtension()->CanExecuteScriptOnPage(contents->GetURL(),
+ contents->GetURL(),
+ execute_tab_id_,
+ NULL,
+ &error_)) {
+ return false;
+ }
+
+ if (details_->code.get())
+ return Execute(*details_->code);
+
+ CHECK(details_->file.get());
+ resource_ = GetExtension()->GetResource(*details_->file);
+
+ if (resource_.extension_root().empty() || resource_.relative_path().empty()) {
+ error_ = keys::kNoCodeOrFileToExecuteError;
+ return false;
+ }
+
+ scoped_refptr<FileReader> file_reader(new FileReader(
+ resource_, base::Bind(&ExecuteCodeInTabFunction::DidLoadFile, this)));
+ file_reader->Start();
+
+ return true;
+}
+
+void ExecuteCodeInTabFunction::OnExecuteCodeFinished(const std::string& error,
+ int32 on_page_id,
+ const GURL& on_url,
+ const ListValue& result) {
+ if (!error.empty())
+ SetError(error);
+
+ SendResponse(error.empty());
+}
+
+void TabsExecuteScriptFunction::OnExecuteCodeFinished(const std::string& error,
+ int32 on_page_id,
+ const GURL& on_url,
+ const ListValue& result) {
+ if (error.empty())
+ SetResult(result.DeepCopy());
+ ExecuteCodeInTabFunction::OnExecuteCodeFinished(error, on_page_id, on_url,
+ result);
+}
+
+bool ExecuteCodeInTabFunction::Init() {
+ if (details_.get())
+ return true;
+
+ // |tab_id| is optional so it's ok if it's not there.
+ int tab_id = -1;
+ args_->GetInteger(0, &tab_id);
+
+ // |details| are not optional.
+ DictionaryValue* details_value = NULL;
+ if (!args_->GetDictionary(1, &details_value))
+ return false;
+ scoped_ptr<InjectDetails> details(new InjectDetails());
+ if (!InjectDetails::Populate(*details_value, details.get()))
+ return false;
+
+ // If the tab ID is -1 then it needs to be converted to the currently active
+ // tab's ID.
+ if (tab_id == -1) {
+ Browser* browser = GetCurrentBrowser();
+ if (!browser)
+ return false;
+ content::WebContents* web_contents = NULL;
+ if (!ExtensionTabUtil::GetDefaultTab(browser, &web_contents, &tab_id))
+ return false;
+ }
+
+ execute_tab_id_ = tab_id;
+ details_ = details.Pass();
+ return true;
+}
+
+void ExecuteCodeInTabFunction::DidLoadFile(bool success,
+ const std::string& data) {
+ std::string function_name = name();
+ const extensions::Extension* extension = GetExtension();
+
+ // Check if the file is CSS and needs localization.
+ if (success &&
+ function_name == TabsInsertCSSFunction::function_name() &&
+ extension != NULL &&
+ data.find(
+ extensions::MessageBundle::kMessageBegin) != std::string::npos) {
+ BrowserThread::PostTask(
+ BrowserThread::FILE, FROM_HERE,
+ base::Bind(&ExecuteCodeInTabFunction::LocalizeCSS, this,
+ data,
+ extension->id(),
+ extension->path(),
+ extension->default_locale()));
+ } else {
+ DidLoadAndLocalizeFile(success, data);
+ }
+}
+
+void ExecuteCodeInTabFunction::LocalizeCSS(
+ const std::string& data,
+ const std::string& extension_id,
+ const FilePath& extension_path,
+ const std::string& extension_default_locale) {
+ scoped_ptr<SubstitutionMap> localization_messages(
+ extension_file_util::LoadMessageBundleSubstitutionMap(
+ extension_path, extension_id, extension_default_locale));
+
+ // We need to do message replacement on the data, so it has to be mutable.
+ std::string css_data = data;
+ std::string error;
+ extensions::MessageBundle::ReplaceMessagesWithExternalDictionary(
+ *localization_messages, &css_data, &error);
+
+ // Call back DidLoadAndLocalizeFile on the UI thread. The success parameter
+ // is always true, because if loading had failed, we wouldn't have had
+ // anything to localize.
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&ExecuteCodeInTabFunction::DidLoadAndLocalizeFile, this,
+ true, css_data));
+}
+
+void ExecuteCodeInTabFunction::DidLoadAndLocalizeFile(bool success,
+ const std::string& data) {
+ if (success) {
+ if (!Execute(data))
+ SendResponse(false);
+ } else {
+#if defined(OS_POSIX)
+ // TODO(viettrungluu): bug: there's no particular reason the path should be
+ // UTF-8, in which case this may fail.
+ error_ = ErrorUtils::FormatErrorMessage(keys::kLoadFileError,
+ resource_.relative_path().value());
+#elif defined(OS_WIN)
+ error_ = ErrorUtils::FormatErrorMessage(keys::kLoadFileError,
+ WideToUTF8(resource_.relative_path().value()));
+#endif // OS_WIN
+ SendResponse(false);
+ }
+}
+
+bool ExecuteCodeInTabFunction::Execute(const std::string& code_string) {
+ content::WebContents* contents = NULL;
+ Browser* browser = NULL;
+
+ bool success = ExtensionTabUtil::GetTabById(
+ execute_tab_id_, profile(), include_incognito(), &browser, NULL,
+ &contents, NULL) && contents && browser;
+
+ if (!success)
+ return false;
+
+ const extensions::Extension* extension = GetExtension();
+ if (!extension)
+ return false;
+
+ ScriptExecutor::ScriptType script_type = ScriptExecutor::JAVASCRIPT;
+ std::string function_name = name();
+ if (function_name == TabsInsertCSSFunction::function_name()) {
+ script_type = ScriptExecutor::CSS;
+ } else if (function_name != TabsExecuteScriptFunction::function_name()) {
+ NOTREACHED();
+ }
+
+ ScriptExecutor::FrameScope frame_scope =
+ details_->all_frames.get() && *details_->all_frames ?
+ ScriptExecutor::ALL_FRAMES :
+ ScriptExecutor::TOP_FRAME;
+
+ UserScript::RunLocation run_at = UserScript::UNDEFINED;
+ switch (details_->run_at) {
+ case InjectDetails::RUN_AT_NONE:
+ case InjectDetails::RUN_AT_DOCUMENT_IDLE:
+ run_at = UserScript::DOCUMENT_IDLE;
+ break;
+ case InjectDetails::RUN_AT_DOCUMENT_START:
+ run_at = UserScript::DOCUMENT_START;
+ break;
+ case InjectDetails::RUN_AT_DOCUMENT_END:
+ run_at = UserScript::DOCUMENT_END;
+ break;
+ }
+ CHECK_NE(UserScript::UNDEFINED, run_at);
+
+ extensions::TabHelper::FromWebContents(contents)->
+ script_executor()->ExecuteScript(
+ extension->id(),
+ script_type,
+ code_string,
+ frame_scope,
+ run_at,
+ ScriptExecutor::ISOLATED_WORLD,
+ base::Bind(&ExecuteCodeInTabFunction::OnExecuteCodeFinished, this));
+ return true;
+}
« no previous file with comments | « chrome/browser/extensions/api/tabs/tabs_api.h ('k') | chrome/browser/extensions/api/tabs/tabs_interactive_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698