| Index: chrome/browser/extensions/extension_sidebar_api.cc
|
| ===================================================================
|
| --- chrome/browser/extensions/extension_sidebar_api.cc (revision 116830)
|
| +++ chrome/browser/extensions/extension_sidebar_api.cc (working copy)
|
| @@ -1,260 +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_sidebar_api.h"
|
| -
|
| -#include "base/json/json_writer.h"
|
| -#include "base/string16.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_service.h"
|
| -#include "chrome/browser/extensions/extension_tab_util.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/sidebar/sidebar_container.h"
|
| -#include "chrome/browser/sidebar/sidebar_manager.h"
|
| -#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
|
| -#include "chrome/common/extensions/extension.h"
|
| -#include "chrome/common/extensions/extension_constants.h"
|
| -#include "chrome/common/extensions/extension_error_utils.h"
|
| -#include "chrome/common/extensions/extension_sidebar_utils.h"
|
| -#include "chrome/common/render_messages.h"
|
| -#include "content/browser/tab_contents/tab_contents.h"
|
| -#include "ipc/ipc_message_utils.h"
|
| -#include "third_party/skia/include/core/SkBitmap.h"
|
| -
|
| -using content::WebContents;
|
| -
|
| -namespace {
|
| -// Errors.
|
| -const char kNoSidebarError[] =
|
| - "This extension has no sidebar specified.";
|
| -const char kNoTabError[] = "No tab with id: *.";
|
| -const char kNoCurrentWindowError[] = "No current browser window was found";
|
| -const char kNoDefaultTabError[] = "No default tab was found";
|
| -const char kInvalidExpandContextError[] =
|
| - "Sidebar can be expanded only in response to an explicit user gesture";
|
| -// Keys.
|
| -const char kBadgeTextKey[] = "text";
|
| -const char kImageDataKey[] = "imageData";
|
| -const char kPathKey[] = "path";
|
| -const char kStateKey[] = "state";
|
| -const char kTabIdKey[] = "tabId";
|
| -const char kTitleKey[] = "title";
|
| -// Events.
|
| -const char kOnStateChanged[] = "experimental.sidebar.onStateChanged";
|
| -} // namespace
|
| -
|
| -namespace extension_sidebar_constants {
|
| -// Sidebar states.
|
| -const char kActiveState[] = "active";
|
| -const char kHiddenState[] = "hidden";
|
| -const char kShownState[] = "shown";
|
| -} // namespace extension_sidebar_constants
|
| -
|
| -// static
|
| -void ExtensionSidebarEventRouter::OnStateChanged(
|
| - Profile* profile, WebContents* tab, const std::string& content_id,
|
| - const std::string& state) {
|
| - int tab_id = ExtensionTabUtil::GetTabId(tab);
|
| - DictionaryValue* details = new DictionaryValue;
|
| - details->Set(kTabIdKey, Value::CreateIntegerValue(tab_id));
|
| - details->Set(kStateKey, Value::CreateStringValue(state));
|
| -
|
| - ListValue args;
|
| - args.Set(0, details);
|
| - std::string json_args;
|
| - base::JSONWriter::Write(&args, false, &json_args);
|
| -
|
| - profile->GetExtensionEventRouter()->DispatchEventToExtension(
|
| - extension_sidebar_utils::GetExtensionIdByContentId(content_id),
|
| - kOnStateChanged, json_args, profile, GURL());
|
| -}
|
| -
|
| -
|
| -// List is considered empty if it is actually empty or contains just one value,
|
| -// either 'null' or 'undefined'.
|
| -static bool IsArgumentListEmpty(const ListValue* arguments) {
|
| - if (arguments->empty())
|
| - return true;
|
| - if (arguments->GetSize() == 1) {
|
| - Value* first_value = 0;
|
| - if (!arguments->Get(0, &first_value))
|
| - return true;
|
| - if (first_value->GetType() == Value::TYPE_NULL)
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -bool SidebarFunction::RunImpl() {
|
| - if (!GetExtension()->sidebar_defaults()) {
|
| - error_ = kNoSidebarError;
|
| - return false;
|
| - }
|
| -
|
| - if (!args_.get())
|
| - return false;
|
| -
|
| - DictionaryValue* details = NULL;
|
| - DictionaryValue default_details;
|
| - if (IsArgumentListEmpty(args_.get())) {
|
| - details = &default_details;
|
| - } else {
|
| - EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details));
|
| - }
|
| -
|
| - int tab_id;
|
| - TabContentsWrapper* tab_contents = NULL;
|
| - if (details->HasKey(kTabIdKey)) {
|
| - EXTENSION_FUNCTION_VALIDATE(details->GetInteger(kTabIdKey, &tab_id));
|
| - if (!ExtensionTabUtil::GetTabById(tab_id, profile(), include_incognito(),
|
| - NULL, NULL, &tab_contents, NULL)) {
|
| - error_ = ExtensionErrorUtils::FormatErrorMessage(
|
| - kNoTabError, base::IntToString(tab_id));
|
| - return false;
|
| - }
|
| - } else {
|
| - Browser* browser = GetCurrentBrowser();
|
| - if (!browser) {
|
| - error_ = kNoCurrentWindowError;
|
| - return false;
|
| - }
|
| - if (!ExtensionTabUtil::GetDefaultTab(browser, &tab_contents, &tab_id)) {
|
| - error_ = kNoDefaultTabError;
|
| - return false;
|
| - }
|
| - }
|
| - if (!tab_contents)
|
| - return false;
|
| -
|
| - std::string content_id(GetExtension()->id());
|
| - return RunImpl(static_cast<TabContents*>(tab_contents->web_contents()),
|
| - content_id, *details);
|
| -}
|
| -
|
| -
|
| -bool CollapseSidebarFunction::RunImpl(TabContents* tab,
|
| - const std::string& content_id,
|
| - const DictionaryValue& details) {
|
| - SidebarManager::GetInstance()->CollapseSidebar(tab, content_id);
|
| - return true;
|
| -}
|
| -
|
| -bool ExpandSidebarFunction::RunImpl(TabContents* tab,
|
| - const std::string& content_id,
|
| - const DictionaryValue& details) {
|
| - // TODO(alekseys): enable this check back when WebKit's user gesture flag
|
| - // reporting for extension calls is fixed.
|
| - // if (!user_gesture()) {
|
| - // error_ = kInvalidExpandContextError;
|
| - // return false;
|
| - // }
|
| - SidebarManager::GetInstance()->ExpandSidebar(tab, content_id);
|
| - return true;
|
| -}
|
| -
|
| -bool GetStateSidebarFunction::RunImpl(TabContents* tab,
|
| - const std::string& content_id,
|
| - const DictionaryValue& details) {
|
| - SidebarManager* manager = SidebarManager::GetInstance();
|
| -
|
| - const char* result = extension_sidebar_constants::kHiddenState;
|
| - if (manager->GetSidebarTabContents(tab, content_id)) {
|
| - bool is_active = false;
|
| - // Sidebar is considered active only if tab is selected, sidebar UI
|
| - // is expanded and this extension's content is displayed on it.
|
| - SidebarContainer* active_sidebar =
|
| - manager->GetActiveSidebarContainerFor(tab);
|
| - // Check if sidebar UI is expanded and this extension's content
|
| - // is displayed on it.
|
| - if (active_sidebar && active_sidebar->content_id() == content_id) {
|
| - if (!details.HasKey(kTabIdKey)) {
|
| - is_active = NULL != GetCurrentBrowser();
|
| - } else {
|
| - int tab_id;
|
| - EXTENSION_FUNCTION_VALIDATE(details.GetInteger(kTabIdKey, &tab_id));
|
| -
|
| - // Check if this tab is selected.
|
| - Browser* browser = GetCurrentBrowser();
|
| - TabContentsWrapper* contents = NULL;
|
| - int default_tab_id = -1;
|
| - if (browser &&
|
| - ExtensionTabUtil::GetDefaultTab(browser, &contents,
|
| - &default_tab_id)) {
|
| - is_active = default_tab_id == tab_id;
|
| - }
|
| - }
|
| - }
|
| -
|
| - result = is_active ? extension_sidebar_constants::kActiveState :
|
| - extension_sidebar_constants::kShownState;
|
| - }
|
| -
|
| - result_.reset(Value::CreateStringValue(result));
|
| - return true;
|
| -}
|
| -
|
| -bool HideSidebarFunction::RunImpl(TabContents* tab,
|
| - const std::string& content_id,
|
| - const DictionaryValue& details) {
|
| - SidebarManager::GetInstance()->HideSidebar(tab, content_id);
|
| - return true;
|
| -}
|
| -
|
| -bool NavigateSidebarFunction::RunImpl(TabContents* tab,
|
| - const std::string& content_id,
|
| - const DictionaryValue& details) {
|
| - std::string path_string;
|
| - EXTENSION_FUNCTION_VALIDATE(details.GetString(kPathKey, &path_string));
|
| -
|
| - GURL url = extension_sidebar_utils::ResolveRelativePath(
|
| - path_string, GetExtension(), &error_);
|
| - if (!url.is_valid())
|
| - return false;
|
| -
|
| - SidebarManager::GetInstance()->NavigateSidebar(tab, content_id, url);
|
| - return true;
|
| -}
|
| -
|
| -bool SetBadgeTextSidebarFunction::RunImpl(TabContents* tab,
|
| - const std::string& content_id,
|
| - const DictionaryValue& details) {
|
| - string16 badge_text;
|
| - EXTENSION_FUNCTION_VALIDATE(details.GetString(kBadgeTextKey, &badge_text));
|
| - SidebarManager::GetInstance()->SetSidebarBadgeText(
|
| - tab, content_id, badge_text);
|
| - return true;
|
| -}
|
| -
|
| -bool SetIconSidebarFunction::RunImpl(TabContents* tab,
|
| - const std::string& content_id,
|
| - const DictionaryValue& details) {
|
| - base::BinaryValue* binary;
|
| - EXTENSION_FUNCTION_VALIDATE(details.GetBinary(kImageDataKey, &binary));
|
| - IPC::Message bitmap_pickle(binary->GetBuffer(), binary->GetSize());
|
| - void* iter = NULL;
|
| - scoped_ptr<SkBitmap> bitmap(new SkBitmap);
|
| - EXTENSION_FUNCTION_VALIDATE(
|
| - IPC::ReadParam(&bitmap_pickle, &iter, bitmap.get()));
|
| - SidebarManager::GetInstance()->SetSidebarIcon(tab, content_id, *bitmap);
|
| - return true;
|
| -}
|
| -
|
| -bool SetTitleSidebarFunction::RunImpl(TabContents* tab,
|
| - const std::string& content_id,
|
| - const DictionaryValue& details) {
|
| - string16 title;
|
| - EXTENSION_FUNCTION_VALIDATE(details.GetString(kTitleKey, &title));
|
| - SidebarManager::GetInstance()->SetSidebarTitle(tab, content_id, title);
|
| - return true;
|
| -}
|
| -
|
| -bool ShowSidebarFunction::RunImpl(TabContents* tab,
|
| - const std::string& content_id,
|
| - const DictionaryValue& details) {
|
| - SidebarManager::GetInstance()->ShowSidebar(tab, content_id);
|
| - return true;
|
| -}
|
|
|