diff options
Diffstat (limited to 'chrome/browser')
6 files changed, 0 insertions, 1576 deletions
diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc index 0869b61..8501b79 100644 --- a/chrome/browser/extensions/extension_function_dispatcher.cc +++ b/chrome/browser/extensions/extension_function_dispatcher.cc @@ -32,7 +32,6 @@ #include "chrome/browser/extensions/extension_management_api.h" #include "chrome/browser/extensions/extension_metrics_module.h" #include "chrome/browser/extensions/extension_module.h" -#include "chrome/browser/extensions/extension_offscreen_tabs_module.h" #include "chrome/browser/extensions/extension_omnibox_api.h" #include "chrome/browser/extensions/extension_page_actions_module.h" #include "chrome/browser/extensions/extension_permissions_api.h" @@ -448,16 +447,6 @@ void FactoryRegistry::ResetFunctions() { RegisterFunction<DownloadsAcceptDangerFunction>(); RegisterFunction<DownloadsShowFunction>(); RegisterFunction<DownloadsDragFunction>(); - - // Experimental Offscreen Tabs - RegisterFunction<CreateOffscreenTabFunction>(); - RegisterFunction<GetOffscreenTabFunction>(); - RegisterFunction<GetAllOffscreenTabFunction>(); - RegisterFunction<RemoveOffscreenTabFunction>(); - RegisterFunction<SendKeyboardEventOffscreenTabFunction>(); - RegisterFunction<SendMouseEventOffscreenTabFunction>(); - RegisterFunction<ToDataUrlOffscreenTabFunction>(); - RegisterFunction<UpdateOffscreenTabFunction>(); } void FactoryRegistry::GetAllNames(std::vector<std::string>* names) { diff --git a/chrome/browser/extensions/extension_offscreen_tabs_apitest.cc b/chrome/browser/extensions/extension_offscreen_tabs_apitest.cc deleted file mode 100644 index aad5f9e..0000000 --- a/chrome/browser/extensions/extension_offscreen_tabs_apitest.cc +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/command_line.h" -#include "chrome/browser/extensions/extension_apitest.h" -#include "chrome/common/chrome_switches.h" - -class ExperimentalApiTest : public ExtensionApiTest { - public: - void SetUpCommandLine(CommandLine* command_line) { - ExtensionApiTest::SetUpCommandLine(command_line); - command_line->AppendSwitch(switches::kEnableExperimentalExtensionApis); - } -}; - -IN_PROC_BROWSER_TEST_F(ExperimentalApiTest, OffscreenTabs) { - ASSERT_TRUE(RunExtensionTest("offscreen_tabs")) << message_; -} - diff --git a/chrome/browser/extensions/extension_offscreen_tabs_module.cc b/chrome/browser/extensions/extension_offscreen_tabs_module.cc deleted file mode 100644 index 3b7b09e..0000000 --- a/chrome/browser/extensions/extension_offscreen_tabs_module.cc +++ /dev/null @@ -1,1228 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/extensions/extension_offscreen_tabs_module.h" - -#include <algorithm> -#include <vector> - -#include "base/base64.h" -#include "base/json/json_writer.h" -#include "base/memory/ref_counted_memory.h" -#include "base/stl_util.h" -#include "base/string_number_conversions.h" -#include "base/string_util.h" -#include "base/values.h" -#include "chrome/browser/extensions/extension_event_router.h" -#include "chrome/browser/extensions/extension_function_dispatcher.h" -#include "chrome/browser/extensions/extension_host.h" -#include "chrome/browser/extensions/extension_message_service.h" -#include "chrome/browser/extensions/extension_offscreen_tabs_module_constants.h" -#include "chrome/browser/extensions/extension_service.h" -#include "chrome/browser/extensions/extension_tabs_module.h" -#include "chrome/browser/net/url_fixer_upper.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_navigator.h" -#include "chrome/browser/ui/browser_window.h" -#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" -#include "chrome/browser/ui/window_sizer.h" -#include "chrome/common/chrome_notification_types.h" -#include "chrome/common/extensions/extension.h" -#include "chrome/common/extensions/extension_error_utils.h" -#include "chrome/common/extensions/extension_messages.h" -#include "chrome/common/pref_names.h" -#include "chrome/common/url_constants.h" -#include "content/browser/renderer_host/backing_store.h" -#include "content/browser/renderer_host/render_view_host.h" -#include "content/browser/renderer_host/render_view_host_delegate.h" -#include "content/browser/tab_contents/navigation_entry.h" -#include "content/browser/tab_contents/tab_contents.h" -#include "content/browser/tab_contents/tab_contents_view.h" -#include "content/common/content_client.h" -#include "content/common/notification_service.h" -#include "skia/ext/image_operations.h" -#include "skia/ext/platform_canvas.h" -#include "third_party/skia/include/core/SkBitmap.h" -#include "ui/gfx/codec/jpeg_codec.h" -#include "ui/gfx/codec/png_codec.h" - -using WebKit::WebInputEvent; - -namespace keys = extension_offscreen_tabs_module_constants; - -namespace { - -class ParentTab; - -// Offscreen Tab --------------------------------------------------------------- - -// This class is responsible for the creation and destruction of offscreen tabs, -// as well as dispatching an onUpdated event. -class OffscreenTab : public NotificationObserver { - public: - OffscreenTab(); - virtual ~OffscreenTab(); - void Init(const GURL& url, - const int width, - const int height, - Profile* profile, - ParentTab* parent_tab); - - TabContentsWrapper* tab() { return tab_.get(); } - TabContents* contents() { return tab_.get()->tab_contents(); } - ParentTab* parent_tab() { return parent_tab_; } - DictionaryValue* CreateValue(); // Creates an offscreen tab object returned - // by the API methods. - // The caller owns the returned value. - - void SetURL(const GURL& url); - void SetSize(int width, int height); - - private: - virtual void Observe(int type, - const NotificationSource& source, - const NotificationDetails& details) OVERRIDE; - - NotificationRegistrar registrar_; - - scoped_ptr<TabContentsWrapper> tab_; // TabContentsWrapper associated with - // this offscreen tab. - ParentTab* parent_tab_; - - DISALLOW_COPY_AND_ASSIGN(OffscreenTab); -}; - -typedef std::vector<OffscreenTab*> TabVector; -typedef TabVector::iterator TabIterator; -typedef TabVector::const_iterator ConstTabIterator; - -// ParentTab ------------------------------------------------------------------- - -// Holds info about a tab that has spawned at least one offscreen tab. -// Each ParentTab keeps track of its child offscreen tabs. The ParentTab is also -// responsible for killing its children when it navigates away or gets closed. -class ParentTab : public NotificationObserver { - public: - ParentTab(); - virtual ~ParentTab(); - void Init(TabContents* tab_contents, const std::string& extension_id); - - TabContentsWrapper* tab() { return tab_; } - TabContents* contents() { return tab_->tab_contents(); } - const TabVector& offscreen_tabs() { return offscreen_tabs_; } - const std::string& extension_id() const { return extension_id_; } - - // Tab takes ownership of OffscreenTab. - void AddOffscreenTab(OffscreenTab *tab); - // This deletes the OffscreenTab. - void RemoveOffscreenTab(OffscreenTab *tab); - - private: - virtual void Observe(int type, - const NotificationSource& source, - const NotificationDetails& details) OVERRIDE; - - NotificationRegistrar registrar_; - - TabContentsWrapper* tab_; // TabContentsWrapper associated with this tab. - TabVector offscreen_tabs_; // Offscreen tabs spawned by this tab. - std::string extension_id_; // Id of the extension running in this tab. - - DISALLOW_COPY_AND_ASSIGN(ParentTab); -}; - -// Map ------------------------------------------------------------------------- - -// This map keeps track of all tabs that are happy parents of offscreen tabs. -class Map { - public: - Map(); - ~Map(); - - // Gets an offscreen tab by ID. - bool GetOffscreenTab(const int offscreen_tab_id, - ExtensionFunctionDispatcher* dispatcher, - Profile* profile, - OffscreenTab** offscreen_tab, - std::string* error_message); - // Gets a parent tab by ID. - bool GetParentTab(const int parent_tab_id, - ParentTab** tab, - std::string* error_message); - // Creates a mapping between a parent tab and an offscreen tab. - bool AddOffscreenTab(OffscreenTab* offscreen_tab, - const GURL& url, - const int width, - const int height, - Profile* profile, - ExtensionFunctionDispatcher* dispatcher, - const std::string& ext_id, - std::string* error_message); - // Removes the mapping between a parent tab and an offscreen tab. - // May cause the Tab object associated with the parent to be deleted. - bool RemoveOffscreenTab(const int offscreen_tab_id, - ExtensionFunctionDispatcher* dispatcher, - Profile* profile, - std::string* error_message); - // Removes a parent tab from the map along with its child offscreen tabs. - // It is called by the destructor of a ParentTab. - bool RemoveParentTab(const int parent_tab_id, std::string* error_message); - - private: - typedef base::hash_map<int, ParentTab*> TabMap; - TabMap map; - - DISALLOW_COPY_AND_ASSIGN(Map); -}; - -// Variables ------------------------------------------------------------------- - -Map* map = NULL; - -// We are assuming that offscreen tabs will not be created by background pages -// with the exception of the API test background page. We keep track of the -// offscreen tabs associated with the test API background page via this variable -// These tab contents are created just for convenience and do not do anything. -// TODO(alexbost): Think about handling multiple background pages each spawning -// offscreen tabs. Would background pages want to spawn offscreen tabs? -// If not, we need to somehow distinguish between the test background page and -// regular background pages and disallow offscreen tab creation for the latter. -TabContents* background_page_tab_contents = NULL; - -// Util ------------------------------------------------------------------------ - -// Gets the map of parent tabs to offscreen tabs. -Map* GetMap() { - if (map == NULL) - map = new Map(); - - return map; -} - -// Gets the TabContents associated with the test API background page. -TabContents* GetBackgroundPageTabContents(Profile* profile) { - if (background_page_tab_contents == NULL) { - background_page_tab_contents = - new TabContents(profile, NULL, MSG_ROUTING_NONE, NULL, NULL); - new TabContentsWrapper(background_page_tab_contents); - } - - return background_page_tab_contents; -} - -// Gets the contents of the tab that instantiated the extension API call. -// In the case of background pages we use tab contents created by us. -bool GetCurrentTabContents(ExtensionFunctionDispatcher* dispatcher, - Profile* profile, - TabContents** tab_contents, - std::string* error_message) { - *tab_contents = dispatcher->delegate()->GetAssociatedTabContents(); - - // Background page (no associated tab contents). - if (!*tab_contents) - *tab_contents = GetBackgroundPageTabContents(profile); - - if (*tab_contents) - return true; - - *error_message = keys::kCurrentTabNotFound; - return false; -} - -// TODO(alexbost): Needs refactoring. Similar method in extension_tabs_module. -// Takes |url_string| and returns a GURL which is either valid and absolute -// or invalid. If |url_string| is not directly interpretable as a valid (it is -// likely a relative URL) an attempt is made to resolve it. |extension| is -// provided so it can be resolved relative to its extension base -// (chrome-extension://<id>/). Using the source frame url would be more correct, -// but because the api shipped with urls resolved relative to their extension -// base, we decided it wasn't worth breaking existing extensions to fix. -GURL ResolvePossiblyRelativeURL(const std::string& url_string, - const Extension* extension) { - GURL url = GURL(url_string); - if (!url.is_valid()) - url = extension->GetResourceURL(url_string); - - return url; -} - -// TODO(alexbost): Needs refactoring. Similar method in extension_tabs_module. -bool IsCrashURL(const GURL& url) { - // Check a fixed-up URL, to normalize the scheme and parse hosts correctly. - GURL fixed_url = - URLFixerUpper::FixupURL(url.possibly_invalid_spec(), std::string()); - return (fixed_url.SchemeIs(chrome::kChromeUIScheme) && - (fixed_url.host() == chrome::kChromeUIBrowserCrashHost || - fixed_url.host() == chrome::kChromeUICrashHost)); -} - -// Offscreen Tab --------------------------------------------------------------- - -OffscreenTab::OffscreenTab() - : parent_tab_(NULL) { -} - -OffscreenTab::~OffscreenTab() {} - -void OffscreenTab::Init(const GURL& url, - const int width, - const int height, - Profile* profile, - ParentTab* parent_tab) { - // Create the offscreen tab. - TabContents* tab_contents = new TabContents( - profile, NULL, MSG_ROUTING_NONE, NULL, NULL); - tab_.reset(new TabContentsWrapper(tab_contents)); - - SetSize(width, height); // Setting the size starts the renderer. - SetURL(url); - parent_tab_ = parent_tab; - - // Register for tab notifications. - registrar_.Add(this, - content::NOTIFICATION_NAV_ENTRY_COMMITTED, - Source<NavigationController>(&contents()->controller())); -} - -DictionaryValue* OffscreenTab::CreateValue() { - DictionaryValue* result = new DictionaryValue(); - - result->SetInteger(keys::kIdKey, ExtensionTabUtil::GetTabId(contents())); - result->SetString(keys::kUrlKey, contents()->GetURL().spec()); - result->SetInteger(keys::kWidthKey, - contents()->view()->GetContainerSize().width()); - result->SetInteger(keys::kHeightKey, - contents()->view()->GetContainerSize().height()); - - return result; -} - -void OffscreenTab::SetURL(const GURL& url) { - contents()->controller().LoadURL( - url, GURL(), PageTransition::LINK, std::string()); -} - -void OffscreenTab::SetSize(int width, int height) { - contents()->view()->SizeContents(gfx::Size(width, height)); -} - -void OffscreenTab::Observe(int type, - const NotificationSource& source, - const NotificationDetails& details) { - DCHECK_EQ(content::NOTIFICATION_NAV_ENTRY_COMMITTED, type); - - DictionaryValue* changed_properties = new DictionaryValue(); - changed_properties->SetString(keys::kUrlKey, contents()->GetURL().spec()); - - ListValue args; - args.Append( - Value::CreateIntegerValue(ExtensionTabUtil::GetTabId(contents()))); - args.Append(changed_properties); - args.Append(CreateValue()); - std::string json_args; - base::JSONWriter::Write(&args, false, &json_args); - - ListValue event_args; - event_args.Set(0, Value::CreateStringValue(keys::kEventOnUpdated)); - event_args.Set(1, Value::CreateStringValue(json_args)); - - // Dispatch an onUpdated event. - // The primary use case for broadcasting the event is - // when the offscreen tab is generated by a test API background page. - if (parent_tab_->contents() == background_page_tab_contents) { - Profile* profile = parent_tab_->tab()->profile(); - profile->GetExtensionEventRouter()->DispatchEventToRenderers( - keys::kEventOnUpdated, json_args, profile, GURL()); - } else { - // Send a routed event directly to the parent tab. - if (parent_tab_->contents()->render_view_host() && - parent_tab_->contents()->render_view_host()->process()) - parent_tab_->contents()->render_view_host()->process()->Send( - new ExtensionMsg_MessageInvoke( - parent_tab_->contents()->render_view_host()->routing_id(), - parent_tab_->extension_id(), - keys::kDispatchEvent, - event_args, - GURL())); - } -} - -// ParentTab ------------------------------------------------------------------- - -ParentTab::ParentTab() - : tab_(NULL) { -} - -ParentTab::~ParentTab() { - // Kill child offscreen tabs. - STLDeleteElements(&offscreen_tabs_); - - bool removed = GetMap()->RemoveParentTab( - ExtensionTabUtil::GetTabId(contents()), new std::string()); - DCHECK(removed); -} - -void ParentTab::Init(TabContents* tab_contents, - const std::string& extension_id) { - DCHECK(tab_contents); - - tab_ = TabContentsWrapper::GetCurrentWrapperForContents(tab_contents); - DCHECK(tab_); - - extension_id_ = extension_id; - - // Register for tab notifications. - registrar_.Add(this, - content::NOTIFICATION_NAV_ENTRY_COMMITTED, - Source<NavigationController>(&contents()->controller())); - - registrar_.Add(this, - content::NOTIFICATION_TAB_CONTENTS_DESTROYED, - Source<TabContents>(contents())); -} - -void ParentTab::AddOffscreenTab(OffscreenTab *offscreen_tab) { - offscreen_tabs_.push_back(offscreen_tab); -} - -void ParentTab::RemoveOffscreenTab(OffscreenTab *offscreen_tab) { - TabIterator it_tab = std::find( - offscreen_tabs_.begin(), offscreen_tabs_.end(), offscreen_tab); - offscreen_tabs_.erase(it_tab); - - delete offscreen_tab; -} - -void ParentTab::Observe(int type, - const NotificationSource& source, - const NotificationDetails& details) { - DCHECK(type == content::NOTIFICATION_NAV_ENTRY_COMMITTED || - type == content::NOTIFICATION_TAB_CONTENTS_DESTROYED); - - delete this; -} - -// Map ------------------------------------------------------------------------- - -Map::Map() {} -Map::~Map() {} - -bool Map::GetOffscreenTab(const int offscreen_tab_id, - ExtensionFunctionDispatcher* dispatcher, - Profile* profile, - OffscreenTab** offscreen_tab, - std::string* error_message) { - // Ensure that the current tab is the parent of the offscreen tab. - TabContents* tab_contents = NULL; - if (!GetCurrentTabContents(dispatcher, profile, &tab_contents, error_message)) - return false; - - ParentTab* parent_tab = NULL; - if (!GetParentTab( - ExtensionTabUtil::GetTabId(tab_contents), &parent_tab, error_message)) - return false; - - const TabVector& offscreen_tabs = parent_tab->offscreen_tabs(); - - for (ConstTabIterator it = offscreen_tabs.begin(); - it != offscreen_tabs.end(); ++it) { - if (ExtensionTabUtil::GetTabId((*it)->contents()) == offscreen_tab_id) { - *offscreen_tab = *it; - return true; - } - } - - *error_message = ExtensionErrorUtils::FormatErrorMessage( - keys::kOffscreenTabNotFoundError, base::IntToString(offscreen_tab_id)); - return false; -} - -bool Map::GetParentTab(const int parent_tab_id, - ParentTab** parent_tab, - std::string* error_message) { - TabMap::iterator it = map.find(parent_tab_id); - - if (it == map.end()) { - *error_message = ExtensionErrorUtils::FormatErrorMessage( - keys::kTabNotFoundError, base::IntToString(parent_tab_id)); - return false; - } - - *parent_tab = it->second; - - return true; -} - -bool Map::AddOffscreenTab(OffscreenTab* offscreen_tab, - const GURL& url, - const int width, - const int height, - Profile* profile, - ExtensionFunctionDispatcher* dispatcher, - const std::string& ext_id, - std::string* error_message) { - // Get parent tab. - TabContents* tab_contents = NULL; - if (!GetCurrentTabContents(dispatcher, profile, &tab_contents, error_message)) - return false; - int offscreen_tab_id = ExtensionTabUtil::GetTabId(tab_contents); - - ParentTab* parent_tab = NULL; - if (!GetParentTab(offscreen_tab_id, &parent_tab, error_message)) { - parent_tab = new ParentTab(); - parent_tab->Init(tab_contents, ext_id); - - map[offscreen_tab_id] = parent_tab; - } - - offscreen_tab->Init(url, width, height, profile, parent_tab); - - // Add child to parent. - parent_tab->AddOffscreenTab(offscreen_tab); - - return true; -} - -bool Map::RemoveOffscreenTab(const int offscreen_tab_id, - ExtensionFunctionDispatcher* dispatcher, - Profile* profile, - std::string* error_message) { - OffscreenTab* offscreen_tab = NULL; - if (!GetOffscreenTab(offscreen_tab_id, dispatcher, profile, - &offscreen_tab, error_message)) - return false; - - ParentTab* parent_tab = offscreen_tab->parent_tab(); - - parent_tab->RemoveOffscreenTab(offscreen_tab); - offscreen_tab = NULL; - - // If this was the last offscreen tab for the parent tab, remove the parent. - if (parent_tab->offscreen_tabs().empty()) - delete parent_tab; // Causes tab to be removed from the map! - - return true; -} - -bool Map::RemoveParentTab(const int parent_tab_id, std::string* error_message) { - if (map.find(parent_tab_id) == map.end()) { - *error_message = ExtensionErrorUtils::FormatErrorMessage( - keys::kTabNotFoundError, base::IntToString(parent_tab_id)); - return false; - } - - map.erase(parent_tab_id); - - return true; -} - -} // namespace - -// API functions --------------------------------------------------------------- - -// create ---------------------------------------------------------------------- - -CreateOffscreenTabFunction::CreateOffscreenTabFunction() {} -CreateOffscreenTabFunction::~CreateOffscreenTabFunction() {} - -bool CreateOffscreenTabFunction::RunImpl() { - DictionaryValue* create_props; - EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &create_props)); - - std::string url_string; - GURL url; - EXTENSION_FUNCTION_VALIDATE( - create_props->GetString(keys::kUrlKey, &url_string)); - url = ResolvePossiblyRelativeURL(url_string, GetExtension()); - if (!url.is_valid()) { - error_ = ExtensionErrorUtils::FormatErrorMessage( - keys::kInvalidUrlError, url_string); - return false; - } - if (IsCrashURL(url)) { - error_ = keys::kNoCrashBrowserError; - return false; - } - - gfx::Rect window_bounds; - bool maximized; - if (!create_props->HasKey(keys::kWidthKey) || - !create_props->HasKey(keys::kHeightKey)) { - Browser* browser = GetCurrentBrowser(); - if (!browser) { - error_ = keys::kNoCurrentWindowError; - return false; - } - - WindowSizer::GetBrowserWindowBounds(std::string(), gfx::Rect(), - browser, &window_bounds, - &maximized); - } - - int width = window_bounds.width(); - if (create_props->HasKey(keys::kWidthKey)) - EXTENSION_FUNCTION_VALIDATE( - create_props->GetInteger(keys::kWidthKey, &width)); - - int height = window_bounds.height(); - if (create_props->HasKey(keys::kHeightKey)) - EXTENSION_FUNCTION_VALIDATE( - create_props->GetInteger(keys::kHeightKey, &height)); - - OffscreenTab* offscreen_tab = new OffscreenTab(); - - // Add the offscreen tab to the map so we don't lose track of it. - if (!GetMap()->AddOffscreenTab(offscreen_tab, url, width, height, profile_, - dispatcher(), extension_id(), &error_)) { - delete offscreen_tab; // Prevent leaking of offscreen tab. - return false; - } - - // TODO(alexbost): Maybe the callback is called too soon. It should probably - // be called once we have navigated to the url. - if (has_callback()) { - result_.reset(offscreen_tab->CreateValue()); - SendResponse(true); - } - - return true; -} - -// get ------------------------------------------------------------------------- - -GetOffscreenTabFunction::GetOffscreenTabFunction() {} -GetOffscreenTabFunction::~GetOffscreenTabFunction() {} - -bool GetOffscreenTabFunction::RunImpl() { - int offscreen_tab_id; - EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &offscreen_tab_id)); - - OffscreenTab* offscreen_tab = NULL; - if (!GetMap()-> - GetOffscreenTab(offscreen_tab_id, dispatcher(), profile_, - &offscreen_tab, &error_)) { - error_ = ExtensionErrorUtils::FormatErrorMessage( - keys::kOffscreenTabNotFoundError, base::IntToString(offscreen_tab_id)); - return false; - } - - if (has_callback()) { - result_.reset(offscreen_tab->CreateValue()); - SendResponse(true); - } - - return true; -} - -// getAll ---------------------------------------------------------------------- - -GetAllOffscreenTabFunction::GetAllOffscreenTabFunction() {} -GetAllOffscreenTabFunction::~GetAllOffscreenTabFunction() {} - -bool GetAllOffscreenTabFunction::RunImpl() { - TabContents* tab_contents = NULL; - if (!GetCurrentTabContents(dispatcher(), profile_, &tab_contents, &error_)) - return false; - - ParentTab* parent_tab = NULL; - if (!GetMap()-> - GetParentTab(ExtensionTabUtil::GetTabId(tab_contents), - &parent_tab, &error_)) - return false; - - const TabVector& offscreen_tabs = parent_tab->offscreen_tabs(); - - ListValue* tab_list = new ListValue(); - for (ConstTabIterator it_tab = offscreen_tabs.begin(); - it_tab != offscreen_tabs.end(); ++it_tab) - tab_list->Append((*it_tab)->CreateValue()); - - if (has_callback()) { - result_.reset(tab_list); - SendResponse(true); - } - - return true; -} - -// remove ---------------------------------------------------------------------- - -RemoveOffscreenTabFunction::RemoveOffscreenTabFunction() {} -RemoveOffscreenTabFunction::~RemoveOffscreenTabFunction() {} - -bool RemoveOffscreenTabFunction::RunImpl() { - int offscreen_tab_id; - EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &offscreen_tab_id)); - - OffscreenTab* offscreen_tab = NULL; - if (!GetMap()->GetOffscreenTab(offscreen_tab_id, dispatcher(), profile_, - &offscreen_tab, &error_)) - return false; - - if (!GetMap()->RemoveOffscreenTab(offscreen_tab_id, dispatcher(), profile_, - &error_)) - return false; - - return true; -} - -// sendKeyboardEvent ----------------------------------------------------------- - -SendKeyboardEventOffscreenTabFunction:: - SendKeyboardEventOffscreenTabFunction() {} -SendKeyboardEventOffscreenTabFunction:: - ~SendKeyboardEventOffscreenTabFunction() {} - -bool SendKeyboardEventOffscreenTabFunction::RunImpl() { - int offscreen_tab_id; - EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &offscreen_tab_id)); - - OffscreenTab* offscreen_tab = NULL; - if (!GetMap()->GetOffscreenTab(offscreen_tab_id, dispatcher(), profile_, - &offscreen_tab, &error_)) - return false; - - // JavaScript KeyboardEvent. - DictionaryValue* js_keyboard_event = NULL; - EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &js_keyboard_event)); - - NativeWebKeyboardEvent keyboard_event; - - std::string type; - if (js_keyboard_event->HasKey(keys::kKeyboardEventTypeKey)) { - EXTENSION_FUNCTION_VALIDATE( - js_keyboard_event->GetString(keys::kKeyboardEventTypeKey, &type)); - } else { - error_ = keys::kInvalidKeyboardEventObjectError; - return false; - } - - if (type.compare(keys::kKeyboardEventTypeValueKeypress) == 0) { - keyboard_event.type = WebInputEvent::Char; - } else if (type.compare(keys::kKeyboardEventTypeValueKeydown) == 0) { - keyboard_event.type = WebInputEvent::KeyDown; - } else if (type.compare(keys::kKeyboardEventTypeValueKeyup) == 0) { - keyboard_event.type = WebInputEvent::KeyUp; - } else { - error_ = keys::kInvalidKeyboardEventObjectError; - return false; - } - - int key_code; - if (js_keyboard_event->HasKey(keys::kKeyboardEventKeyCodeKey)) { - EXTENSION_FUNCTION_VALIDATE(js_keyboard_event-> - GetInteger(keys::kKeyboardEventKeyCodeKey, &key_code)); - } else { - error_ = keys::kInvalidKeyboardEventObjectError; - return false; - } - - keyboard_event.nativeKeyCode = key_code; - keyboard_event.windowsKeyCode = key_code; - keyboard_event.setKeyIdentifierFromWindowsKeyCode(); - - // Keypress = type character - if (type.compare(keys::kKeyboardEventTypeValueKeypress) == 0) { - int char_code; - if (js_keyboard_event->HasKey(keys::kKeyboardEventCharCodeKey)) { - EXTENSION_FUNCTION_VALIDATE(js_keyboard_event-> - GetInteger(keys::kKeyboardEventCharCodeKey, &char_code)); - keyboard_event.text[0] = char_code; - keyboard_event.unmodifiedText[0] = char_code; - } else { - error_ = keys::kInvalidKeyboardEventObjectError; - return false; - } - } - - bool alt_key; - if (js_keyboard_event->HasKey(keys::kKeyboardEventAltKeyKey)) - EXTENSION_FUNCTION_VALIDATE(js_keyboard_event-> - GetBoolean(keys::kKeyboardEventAltKeyKey, &alt_key)); - if (alt_key) - keyboard_event.modifiers |= WebInputEvent::AltKey; - - bool ctrl_key; - if (js_keyboard_event->HasKey(keys::kKeyboardEventCtrlKeyKey)) - EXTENSION_FUNCTION_VALIDATE(js_keyboard_event-> - GetBoolean(keys::kKeyboardEventCtrlKeyKey, &ctrl_key)); - if (ctrl_key) - keyboard_event.modifiers |= WebInputEvent::ControlKey; - - bool meta_key = false; - if (js_keyboard_event->HasKey(keys::kMouseEventMetaKeyKey)) - EXTENSION_FUNCTION_VALIDATE(js_keyboard_event-> - GetBoolean(keys::kMouseEventMetaKeyKey, &meta_key)); - if (meta_key) - keyboard_event.modifiers |= WebInputEvent::MetaKey; - - bool shift_key; - if (js_keyboard_event->HasKey(keys::kKeyboardEventShiftKeyKey)) - EXTENSION_FUNCTION_VALIDATE(js_keyboard_event-> - GetBoolean(keys::kKeyboardEventShiftKeyKey, &shift_key)); - if (shift_key) - keyboard_event.modifiers |= WebInputEvent::ShiftKey; - - // Forward the event. - offscreen_tab->contents()->render_view_host()-> - ForwardKeyboardEvent(keyboard_event); - - if (has_callback()) { - result_.reset(offscreen_tab->CreateValue()); - SendResponse(true); - } - - return true; -} - -// sendMouseEvent -------------------------------------------------------------- - -SendMouseEventOffscreenTabFunction::SendMouseEventOffscreenTabFunction() {} -SendMouseEventOffscreenTabFunction::~SendMouseEventOffscreenTabFunction() {} - -bool SendMouseEventOffscreenTabFunction::RunImpl() { - int offscreen_tab_id; - EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &offscreen_tab_id)); - - OffscreenTab* offscreen_tab = NULL; - if (!GetMap()->GetOffscreenTab(offscreen_tab_id, dispatcher(), profile_, - &offscreen_tab, &error_)) - return false; - - // JavaScript MouseEvent. - DictionaryValue* js_mouse_event = NULL; - EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &js_mouse_event)); - - std::string type; - if (js_mouse_event->HasKey(keys::kMouseEventTypeKey)) { - EXTENSION_FUNCTION_VALIDATE( - js_mouse_event->GetString(keys::kMouseEventTypeKey, &type)); - } else { - error_ = keys::kInvalidMouseEventObjectError; - return false; - } - - if (type.compare(keys::kMouseEventTypeValueMousewheel) == 0) { - WebKit::WebMouseWheelEvent wheel_event; - - wheel_event.type = WebInputEvent::MouseWheel; - - if (js_mouse_event->HasKey(keys::kMouseEventWheelDeltaXKey) && - js_mouse_event->HasKey(keys::kMouseEventWheelDeltaYKey)) { - int delta_x, delta_y; - EXTENSION_FUNCTION_VALIDATE(js_mouse_event-> - GetInteger(keys::kMouseEventWheelDeltaXKey, &delta_x)); - EXTENSION_FUNCTION_VALIDATE(js_mouse_event-> - GetInteger(keys::kMouseEventWheelDeltaYKey, &delta_y)); - wheel_event.deltaX = delta_x; - wheel_event.deltaY = delta_y; - } else { - error_ = keys::kInvalidMouseEventObjectError; - return false; - } - - // Forward the event. - offscreen_tab->contents()->render_view_host()-> - ForwardWheelEvent(wheel_event); - } else { - WebKit::WebMouseEvent mouse_event; - - if (type.compare(keys::kMouseEventTypeValueMousedown) == 0 || - type.compare(keys::kMouseEventTypeValueClick) == 0) { - mouse_event.type = WebKit::WebInputEvent::MouseDown; - } else if (type.compare(keys::kMouseEventTypeValueMouseup) == 0) { - mouse_event.type = WebKit::WebInputEvent::MouseUp; - } else if (type.compare(keys::kMouseEventTypeValueMousemove) == 0) { - mouse_event.type = WebKit::WebInputEvent::MouseMove; - } else { - error_ = keys::kInvalidMouseEventObjectError; - return false; - } - - int button; - if (js_mouse_event->HasKey(keys::kMouseEventButtonKey)) { - EXTENSION_FUNCTION_VALIDATE( - js_mouse_event->GetInteger(keys::kMouseEventButtonKey, &button)); - } else { - error_ = keys::kInvalidMouseEventObjectError; - return false; - } - - if (button == keys::kMouseEventButtonValueLeft) { - mouse_event.button = WebKit::WebMouseEvent::ButtonLeft; - } else if (button == keys::kMouseEventButtonValueMiddle) { - mouse_event.button = WebKit::WebMouseEvent::ButtonMiddle; - } else if (button == keys::kMouseEventButtonValueRight) { - mouse_event.button = WebKit::WebMouseEvent::ButtonRight; - } else { - error_ = keys::kInvalidMouseEventObjectError; - return false; - } - - if (HasOptionalArgument(2) && HasOptionalArgument(3)) { - EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(2, &mouse_event.x)); - EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(3, &mouse_event.y)); - } else { - error_ = keys::kNoMouseCoordinatesError; - return false; - } - - bool alt_key = false; - if (js_mouse_event->HasKey(keys::kMouseEventAltKeyKey)) - EXTENSION_FUNCTION_VALIDATE(js_mouse_event-> - GetBoolean(keys::kMouseEventAltKeyKey, &alt_key)); - if (alt_key) - mouse_event.modifiers |= WebInputEvent::AltKey; - - bool ctrl_key = false; - if (js_mouse_event->HasKey(keys::kMouseEventCtrlKeyKey)) - EXTENSION_FUNCTION_VALIDATE(js_mouse_event-> - GetBoolean(keys::kMouseEventCtrlKeyKey, &ctrl_key)); - if (ctrl_key) - mouse_event.modifiers |= WebInputEvent::ControlKey; - - bool meta_key = false; - if (js_mouse_event->HasKey(keys::kMouseEventMetaKeyKey)) - EXTENSION_FUNCTION_VALIDATE(js_mouse_event-> - GetBoolean(keys::kMouseEventMetaKeyKey, &meta_key)); - if (meta_key) - mouse_event.modifiers |= WebInputEvent::MetaKey; - - bool shift_key = false; - if (js_mouse_event->HasKey(keys::kMouseEventShiftKeyKey)) - EXTENSION_FUNCTION_VALIDATE(js_mouse_event-> - GetBoolean(keys::kMouseEventShiftKeyKey, &shift_key)); - if (shift_key) - mouse_event.modifiers |= WebInputEvent::ShiftKey; - - mouse_event.clickCount = 1; - - // Forward the event. - offscreen_tab->contents()->render_view_host()-> - ForwardMouseEvent(mouse_event); - - // If the event is a click, - // fire a mouseup event in addition to the mousedown. - if (type.compare(keys::kMouseEventTypeValueClick) == 0) { - mouse_event.type = WebKit::WebInputEvent::MouseUp; - offscreen_tab->contents()->render_view_host()-> - ForwardMouseEvent(mouse_event); - } - } - - if (has_callback()) { - result_.reset(offscreen_tab->CreateValue()); - SendResponse(true); - } - - return true; -} - -// toDataUrl ------------------------------------------------------------------- - -ToDataUrlOffscreenTabFunction::ToDataUrlOffscreenTabFunction() {} -ToDataUrlOffscreenTabFunction::~ToDataUrlOffscreenTabFunction() {} - -// TODO(alexbost): Needs refactoring. Similar method in extension_tabs_module. -// TODO(alexbost): We want to optimize this function in order to get more image -// updates on the browser side. One improvement would be to implement another -// hash map in order to get offscreen tabs in O(1). -bool ToDataUrlOffscreenTabFunction::RunImpl() { - int offscreen_tab_id; - EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &offscreen_tab_id)); - - OffscreenTab* offscreen_tab = NULL; - if (!GetMap()->GetOffscreenTab(offscreen_tab_id, dispatcher(), profile_, - &offscreen_tab, &error_)) - return false; - - image_format_ = FORMAT_JPEG; // Default format is JPEG. - image_quality_ = kDefaultQuality; // Default quality setting. - - if (HasOptionalArgument(1)) { - DictionaryValue* options; - EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &options)); - - if (options->HasKey(keys::kFormatKey)) { - std::string format; - EXTENSION_FUNCTION_VALIDATE( - options->GetString(keys::kFormatKey, &format)); - - if (format == keys::kFormatValueJpeg) { - image_format_ = FORMAT_JPEG; - } else if (format == keys::kFormatValuePng) { - image_format_ = FORMAT_PNG; - } else { - // Schema validation should make this unreachable. - EXTENSION_FUNCTION_VALIDATE(0); - } - } - - if (options->HasKey(keys::kQualityKey)) { - EXTENSION_FUNCTION_VALIDATE( - options->GetInteger(keys::kQualityKey, &image_quality_)); - } - } - - // captureVisibleTab() can return an image containing sensitive information - // that the browser would otherwise protect. Ensure the extension has - // permission to do this. - if (!GetExtension()-> - CanCaptureVisiblePage(offscreen_tab->contents()->GetURL(), &error_)) - return false; - -// The backing store approach works on Linux but not on Mac. -// TODO(alexbost): Test on Windows -#if !defined(OS_MACOSX) - RenderViewHost* render_view_host = - offscreen_tab->contents()->render_view_host(); - - // If a backing store is cached for the tab we want to capture, - // and it can be copied into a bitmap, then use it to generate the image. - BackingStore* backing_store = render_view_host->GetBackingStore(false); - if (backing_store && CaptureSnapshotFromBackingStore(backing_store)) - return true; -#endif - - // Ask the renderer for a snapshot of the tab. - TabContentsWrapper* tab_wrapper = offscreen_tab->tab(); - tab_wrapper->CaptureSnapshot(); - registrar_.Add(this, - chrome::NOTIFICATION_TAB_SNAPSHOT_TAKEN, - Source<TabContentsWrapper>(tab_wrapper)); - - AddRef(); // Balanced in ToDataUrlOffscreenTabFunction::Observe(). - - return true; -} - -// TODO(alexbost): Needs refactoring. Similar method in extension_tabs_module. -// Build the image of a tab's contents out of a backing store. -// This may fail if we can not copy a backing store into a bitmap. -// For example, some uncommon X11 visual modes are not supported by -// CopyFromBackingStore(). -bool ToDataUrlOffscreenTabFunction::CaptureSnapshotFromBackingStore( - BackingStore* backing_store) { - - skia::PlatformCanvas temp_canvas; - if (!backing_store->CopyFromBackingStore(gfx::Rect(backing_store->size()), - &temp_canvas)) { - return false; - } - VLOG(1) << "captureVisibleTab() got image from backing store."; - - SendResultFromBitmap( - skia::GetTopDevice(temp_canvas)->accessBitmap(false)); - return true; -} - -// TODO(alexbost): Needs refactoring. Similar method in extension_tabs_module. -void ToDataUrlOffscreenTabFunction::Observe(int type, - const NotificationSource& source, - const NotificationDetails& details) { - DCHECK(type == chrome::NOTIFICATION_TAB_SNAPSHOT_TAKEN); - - const SkBitmap *screen_capture = Details<const SkBitmap>(details).ptr(); - const bool error = screen_capture->empty(); - - if (error) { - error_ = keys::kInternalVisibleTabCaptureError; - SendResponse(false); - } else { - VLOG(1) << "Got image from renderer."; - SendResultFromBitmap(*screen_capture); - } - - Release(); // Balanced in ToDataUrlOffscreenTabFunction::RunImpl(). -} - -// TODO(alexbost): Needs refactoring. Similar method in extension_tabs_module. -// Turn a bitmap of the screen into an image, set that image as the result, -// and call SendResponse(). -void ToDataUrlOffscreenTabFunction::SendResultFromBitmap( - const SkBitmap& screen_capture) { - std::vector<unsigned char> data; - SkAutoLockPixels screen_capture_lock(screen_capture); - bool encoded = false; - std::string mime_type; - switch (image_format_) { - case FORMAT_JPEG: - encoded = gfx::JPEGCodec::Encode( - reinterpret_cast<unsigned char*>(screen_capture.getAddr32(0, 0)), - gfx::JPEGCodec::FORMAT_SkBitmap, - screen_capture.width(), - screen_capture.height(), - static_cast<int>(screen_capture.rowBytes()), - image_quality_, - &data); - mime_type = keys::kMimeTypeJpeg; - break; - case FORMAT_PNG: - encoded = gfx::PNGCodec::EncodeBGRASkBitmap( - screen_capture, - true, // Discard transparency. - &data); - mime_type = keys::kMimeTypePng; - break; - default: - NOTREACHED() << "Invalid image format."; - } - - if (!encoded) { - error_ = keys::kInternalVisibleTabCaptureError; - SendResponse(false); - return; - } - - std::string base64_result; - base::StringPiece stream_as_string( - reinterpret_cast<const char*>(vector_as_array(&data)), data.size()); - - base::Base64Encode(stream_as_string, &base64_result); - base64_result.insert(0, base::StringPrintf("data:%s;base64,", - mime_type.c_str())); - result_.reset(new StringValue(base64_result)); - SendResponse(true); -} - -// update ---------------------------------------------------------------------- - -UpdateOffscreenTabFunction::UpdateOffscreenTabFunction() {} -UpdateOffscreenTabFunction::~UpdateOffscreenTabFunction() {} - -// TODO(alexbost): Needs refactoring. Similar method in extension_tabs_module. -bool UpdateOffscreenTabFunction::RunImpl() { - int offscreen_tab_id; - EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &offscreen_tab_id)); - - OffscreenTab* offscreen_tab = NULL; - if (!GetMap()->GetOffscreenTab(offscreen_tab_id, dispatcher(), profile_, - &offscreen_tab, &error_)) - return false; - - DictionaryValue* update_props; - EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &update_props)); - - // Url - if (update_props->HasKey(keys::kUrlKey)) { - std::string url_string; - GURL url; - EXTENSION_FUNCTION_VALIDATE( - update_props->GetString(keys::kUrlKey, &url_string)); - url = ResolvePossiblyRelativeURL(url_string, GetExtension()); - if (!url.is_valid()) { - error_ = ExtensionErrorUtils::FormatErrorMessage( - keys::kInvalidUrlError, url_string); - return false; - } - if (IsCrashURL(url)) { - error_ = keys::kNoCrashBrowserError; - return false; - } - - // JavaScript URLs can do the same kinds of things as cross-origin XHR, so - // we need to check host permissions before allowing them. - if (url.SchemeIs(chrome::kJavaScriptScheme)) { - if (!GetExtension()->CanExecuteScriptOnPage( - offscreen_tab->contents()->GetURL(), NULL, &error_)) { - return false; - } - - ExtensionMsg_ExecuteCode_Params params; - params.request_id = request_id(); - params.extension_id = extension_id(); - params.is_javascript = true; - params.code = url.path(); - params.all_frames = false; - params.in_main_world = true; - - RenderViewHost* render_view_host = - offscreen_tab->contents()->render_view_host(); - render_view_host->Send( - new ExtensionMsg_ExecuteCode(render_view_host->routing_id(), - params)); - - Observe(offscreen_tab->contents()); - AddRef(); // balanced in Observe() - - return true; - } - - offscreen_tab->SetURL(url); - - // The URL of a tab contents never actually changes to a JavaScript URL, so - // this check only makes sense in other cases. - if (!url.SchemeIs(chrome::kJavaScriptScheme)) - DCHECK_EQ(url.spec(), offscreen_tab->contents()->GetURL().spec()); - } - - // Width and height - if (update_props->HasKey(keys::kWidthKey) || - update_props->HasKey(keys::kHeightKey)) { - int width; - if (update_props->HasKey(keys::kWidthKey)) - EXTENSION_FUNCTION_VALIDATE( - update_props->GetInteger(keys::kWidthKey, &width)); - else - offscreen_tab->contents()->view()->GetContainerSize().width(); - - int height; - if (update_props->HasKey(keys::kHeightKey)) - EXTENSION_FUNCTION_VALIDATE( - update_props->GetInteger(keys::kHeightKey, &height)); - else - offscreen_tab->contents()->view()->GetContainerSize().height(); - - offscreen_tab->SetSize(width, height); - } - - // Callback - if (has_callback()) { - result_.reset(offscreen_tab->CreateValue()); - SendResponse(true); - } - - return true; -} - -// TODO(alexbost): Needs refactoring. Similar method in extension_tabs_module. -bool UpdateOffscreenTabFunction::OnMessageReceived( - const IPC::Message& message) { - if (message.type() != ExtensionHostMsg_ExecuteCodeFinished::ID) - return false; - - int message_request_id; - void* iter = NULL; - if (!message.ReadInt(&iter, &message_request_id)) { - NOTREACHED() << "malformed extension message"; - return true; - } - - if (message_request_id != request_id()) - return false; - - IPC_BEGIN_MESSAGE_MAP(UpdateOffscreenTabFunction, message) - IPC_MESSAGE_HANDLER(ExtensionHostMsg_ExecuteCodeFinished, - OnExecuteCodeFinished) - IPC_END_MESSAGE_MAP() - return true; -} - -// TODO(alexbost): Needs refactoring. Similar method in extension_tabs_module. -void UpdateOffscreenTabFunction:: - OnExecuteCodeFinished(int request_id, - bool success, - const std::string& error) { - if (!error.empty()) { - DCHECK(!success); - error_ = error; - } - - SendResponse(success); - - Observe(NULL); - Release(); // balanced in Execute() -} - diff --git a/chrome/browser/extensions/extension_offscreen_tabs_module.h b/chrome/browser/extensions/extension_offscreen_tabs_module.h deleted file mode 100644 index 37ffa5b..0000000 --- a/chrome/browser/extensions/extension_offscreen_tabs_module.h +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_OFFSCREEN_TABS_MODULE_H__ -#define CHROME_BROWSER_EXTENSIONS_EXTENSION_OFFSCREEN_TABS_MODULE_H__ -#pragma once - -#include <string> - -#include "base/values.h" -#include "chrome/browser/extensions/extension_function.h" -#include "content/browser/tab_contents/tab_contents_observer.h" -#include "content/common/notification_observer.h" -#include "content/common/notification_registrar.h" - -class BackingStore; -class SkBitmap; -class TabContents; -class TabContentsWrapper; - -namespace base { -class DictionaryValue; -class ListValue; -} - -// Creates an offscreen tab and adds it to a map of tabs and their child -// offscreen tabs. -class CreateOffscreenTabFunction : public SyncExtensionFunction { - public: - CreateOffscreenTabFunction(); - virtual ~CreateOffscreenTabFunction(); - virtual bool RunImpl() OVERRIDE; - - private: - DECLARE_EXTENSION_FUNCTION_NAME("experimental.offscreenTabs.create") - DISALLOW_COPY_AND_ASSIGN(CreateOffscreenTabFunction); -}; - -// Gets info about an offscreen tab. -class GetOffscreenTabFunction : public SyncExtensionFunction { - public: - GetOffscreenTabFunction(); - virtual ~GetOffscreenTabFunction(); - virtual bool RunImpl() OVERRIDE; - - private: - DECLARE_EXTENSION_FUNCTION_NAME("experimental.offscreenTabs.get") - DISALLOW_COPY_AND_ASSIGN(GetOffscreenTabFunction); -}; - -// Gets all offscreen tabs created by the tab that invoked this function. -class GetAllOffscreenTabFunction : public SyncExtensionFunction { - public: - GetAllOffscreenTabFunction(); - virtual ~GetAllOffscreenTabFunction(); - virtual bool RunImpl() OVERRIDE; - - private: - DECLARE_EXTENSION_FUNCTION_NAME("experimental.offscreenTabs.getAll") - DISALLOW_COPY_AND_ASSIGN(GetAllOffscreenTabFunction); -}; - -// Removes an offscreen tab. -class RemoveOffscreenTabFunction : public SyncExtensionFunction { - public: - RemoveOffscreenTabFunction(); - virtual ~RemoveOffscreenTabFunction(); - virtual bool RunImpl() OVERRIDE; - - private: - DECLARE_EXTENSION_FUNCTION_NAME("experimental.offscreenTabs.remove") - DISALLOW_COPY_AND_ASSIGN(RemoveOffscreenTabFunction); -}; - -// Synthesizes a keyboard event based on a passed-in JavaScript keyboard event. -class SendKeyboardEventOffscreenTabFunction : public SyncExtensionFunction { - public: - SendKeyboardEventOffscreenTabFunction(); - virtual ~SendKeyboardEventOffscreenTabFunction(); - virtual bool RunImpl() OVERRIDE; - - private: - DECLARE_EXTENSION_FUNCTION_NAME( - "experimental.offscreenTabs.sendKeyboardEvent") - DISALLOW_COPY_AND_ASSIGN(SendKeyboardEventOffscreenTabFunction); -}; - -// Synthesizes a mouse event based on a passed-in JavaScript mouse event. -// Since only the application knows where the user clicks, x and y coordinates -// need to be passed in as well in this case of click, mousedown, and mouseup. -class SendMouseEventOffscreenTabFunction : public SyncExtensionFunction { - public: - SendMouseEventOffscreenTabFunction(); - virtual ~SendMouseEventOffscreenTabFunction(); - virtual bool RunImpl() OVERRIDE; - - private: - DECLARE_EXTENSION_FUNCTION_NAME("experimental.offscreenTabs.sendMouseEvent") - DISALLOW_COPY_AND_ASSIGN(SendMouseEventOffscreenTabFunction); -}; - -// Gets a snapshot of the offscreen tabs and returns it as a data URL. -class ToDataUrlOffscreenTabFunction : public AsyncExtensionFunction, - public NotificationObserver { - public: - ToDataUrlOffscreenTabFunction(); - virtual ~ToDataUrlOffscreenTabFunction(); - virtual bool RunImpl() OVERRIDE; - - private: - enum ImageFormat { - FORMAT_JPEG, - FORMAT_PNG - }; - - // The default quality setting used when encoding jpegs. - static const int kDefaultQuality = 90; - virtual bool CaptureSnapshotFromBackingStore(BackingStore* backing_store); - virtual void Observe(int type, - const NotificationSource& source, - const NotificationDetails& details) OVERRIDE; - virtual void SendResultFromBitmap(const SkBitmap& screen_capture); - - NotificationRegistrar registrar_; - - // The format (JPEG vs PNG) of the resulting image. Set in RunImpl(). - ImageFormat image_format_; - - // Quality setting to use when encoding jpegs. Set in RunImpl(). - int image_quality_; - - DECLARE_EXTENSION_FUNCTION_NAME("experimental.offscreenTabs.toDataUrl") - DISALLOW_COPY_AND_ASSIGN(ToDataUrlOffscreenTabFunction); -}; - -// Updates an offscreen tab. -class UpdateOffscreenTabFunction : public AsyncExtensionFunction, - public TabContentsObserver { - public: - UpdateOffscreenTabFunction(); - virtual ~UpdateOffscreenTabFunction(); - virtual bool RunImpl() OVERRIDE; - - private: - virtual bool OnMessageReceived(const IPC::Message& message); - void OnExecuteCodeFinished(int request_id, - bool success, - const std::string& error); - - DECLARE_EXTENSION_FUNCTION_NAME("experimental.offscreenTabs.update") - DISALLOW_COPY_AND_ASSIGN(UpdateOffscreenTabFunction); -}; - -#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_OFFSCREEN_TABS_MODULE_H__ - diff --git a/chrome/browser/extensions/extension_offscreen_tabs_module_constants.cc b/chrome/browser/extensions/extension_offscreen_tabs_module_constants.cc deleted file mode 100644 index 1a6596d..0000000 --- a/chrome/browser/extensions/extension_offscreen_tabs_module_constants.cc +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/extensions/extension_offscreen_tabs_module_constants.h" - -namespace extension_offscreen_tabs_module_constants { - -// offscreen tab keys -const char kIdKey[] = "id"; -const char kUrlKey[] = "url"; -const char kWidthKey[] = "width"; -const char kHeightKey[] = "height"; - -// toDataUrl keys -const char kFormatKey[] = "format"; -const char kQualityKey[] = "quality"; - -// mouse keys -const char kMouseEventTypeKey[] = "type"; -const char kMouseEventButtonKey[] = "button"; -const char kMouseEventWheelDeltaXKey[] = "wheelDeltaX"; -const char kMouseEventWheelDeltaYKey[] = "wheelDeltaY"; -const char kMouseEventAltKeyKey[] = "altKey"; -const char kMouseEventCtrlKeyKey[] = "ctrlKey"; -const char kMouseEventMetaKeyKey[] = "metaKey"; -const char kMouseEventShiftKeyKey[] = "shiftKey"; - -// toDataUrl values -const char kFormatValueJpeg[] = "jpeg"; -const char kFormatValuePng[] = "png"; -const char kMimeTypeJpeg[] = "image/jpeg"; -const char kMimeTypePng[] = "image/png"; - -// mouse values -const char kMouseEventTypeValueMousedown[] = "mousedown"; -const char kMouseEventTypeValueMouseup[] = "mouseup"; -const char kMouseEventTypeValueClick[] = "click"; -const char kMouseEventTypeValueMousemove[] = "mousemove"; -const char kMouseEventTypeValueMousewheel[] = "mousewheel"; -const int kMouseEventButtonValueLeft = 0; -const int kMouseEventButtonValueMiddle = 1; -const int kMouseEventButtonValueRight = 2; - -// keyboard keys -const char kKeyboardEventTypeKey[] = "type"; -const char kKeyboardEventCharCodeKey[] = "charCode"; -const char kKeyboardEventKeyCodeKey[] = "keyCode"; -const char kKeyboardEventAltKeyKey[] = "altKey"; -const char kKeyboardEventCtrlKeyKey[] = "ctrlKey"; -const char kKeyboardEventShiftKeyKey[] = "shiftKey"; - -// keyboard values -const char kKeyboardEventTypeValueKeypress[] = "keypress"; -const char kKeyboardEventTypeValueKeydown[] = "keydown"; -const char kKeyboardEventTypeValueKeyup[] = "keyup"; - -// events -const char kDispatchEvent[] = "Event.dispatchJSON"; -const char kEventOnUpdated[] = "experimental.offscreenTabs.onUpdated"; - -// errors -const char kCurrentTabNotFound[] = "No current tab found"; -const char kInternalVisibleTabCaptureError[] = - "Internal error while trying to capture visible region of the current tab"; -const char kInvalidKeyboardEventObjectError[] = - "Invalid or unexpected KeyboardEvent object"; -const char kInvalidMouseEventObjectError[] = - "Invalid or enexpected MouseEvent object"; -const char kInvalidUrlError[] = "Invalid url: \"*\"."; -const char kNoCrashBrowserError[] = "I'm sorry. I'm afraid I can't do that."; -const char kNoCurrentWindowError[] = "No current window"; -const char kNoMouseCoordinatesError[] = "No mouse coordinates specified"; -const char kOffscreenTabNotFoundError[] = "No offscreen tab with id: *."; -const char kTabNotFoundError[] = "No tab with id: *."; - -} // namespace extension_offscreen_tabs_module_constants - diff --git a/chrome/browser/extensions/extension_offscreen_tabs_module_constants.h b/chrome/browser/extensions/extension_offscreen_tabs_module_constants.h deleted file mode 100644 index 1ae5200..0000000 --- a/chrome/browser/extensions/extension_offscreen_tabs_module_constants.h +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Constants used for the Tabs API and the Windows API. - -#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_OFFSCREEN_TABS_MODULE_CONSTANTS_H_ -#define CHROME_BROWSER_EXTENSIONS_EXTENSION_OFFSCREEN_TABS_MODULE_CONSTANTS_H_ -#pragma once - -namespace extension_offscreen_tabs_module_constants { - -// TODO(alexbost): Some of these should be refactored - -// offscreen tab keys -extern const char kIdKey[]; -extern const char kUrlKey[]; -extern const char kWidthKey[]; -extern const char kHeightKey[]; - -// toDataUrl keys -extern const char kFormatKey[]; -extern const char kQualityKey[]; - -// mouse keys -extern const char kMouseEventTypeKey[]; -extern const char kMouseEventButtonKey[]; -extern const char kMouseEventWheelDeltaXKey[]; -extern const char kMouseEventWheelDeltaYKey[]; -extern const char kMouseEventAltKeyKey[]; -extern const char kMouseEventCtrlKeyKey[]; -extern const char kMouseEventMetaKeyKey[]; -extern const char kMouseEventShiftKeyKey[]; - -// toDataUrl values -extern const char kFormatValueJpeg[]; -extern const char kFormatValuePng[]; -extern const char kMimeTypeJpeg[]; -extern const char kMimeTypePng[]; - -// mouse values -extern const char kMouseEventTypeValueMousedown[]; -extern const char kMouseEventTypeValueMouseup[]; -extern const char kMouseEventTypeValueClick[]; -extern const char kMouseEventTypeValueMousemove[]; -extern const char kMouseEventTypeValueMousewheel[]; -extern const int kMouseEventButtonValueLeft; -extern const int kMouseEventButtonValueMiddle; -extern const int kMouseEventButtonValueRight; - -// keyboard keys -extern const char kKeyboardEventTypeKey[]; -extern const char kKeyboardEventCharCodeKey[]; -extern const char kKeyboardEventKeyCodeKey[]; -extern const char kKeyboardEventAltKeyKey[]; -extern const char kKeyboardEventCtrlKeyKey[]; -extern const char kKeyboardEventShiftKeyKey[]; - -// keyboard values -extern const char kKeyboardEventTypeValueKeypress[]; -extern const char kKeyboardEventTypeValueKeydown[]; -extern const char kKeyboardEventTypeValueKeyup[]; - -// events -extern const char kDispatchEvent[]; -extern const char kEventOnUpdated[]; - -// errors -extern const char kCurrentTabNotFound[]; -extern const char kInternalVisibleTabCaptureError[]; -extern const char kInvalidKeyboardEventObjectError[]; -extern const char kInvalidMouseEventObjectError[]; -extern const char kInvalidUrlError[]; -extern const char kNoCrashBrowserError[]; -extern const char kNoCurrentWindowError[]; -extern const char kNoMouseCoordinatesError[]; -extern const char kOffscreenTabNotFoundError[]; -extern const char kTabNotFoundError[]; - -}; // namespace extension_offscreen_tabs_module_constants - -#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_OFFSCREEN_TABS_MODULE_CONSTANTS_H_ - |