1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_page_actions_module.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <string> 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_page_actions_module_constants.h" 1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_tab_helper.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_tabs_module.h" 1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h" 1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension_action.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension_error_utils.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/render_messages.h" 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/navigation_entry.h" 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace keys = extension_page_actions_module_constants; 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Errors. 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kNoTabError[] = "No tab with id: *."; 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kNoPageActionError[] = 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "This extension has no page action specified."; 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kUrlNotActiveError[] = "This url is no longer active: *."; 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kIconIndexOutOfBounds[] = "Page action icon index out of bounds."; 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kNoIconSpecified[] = "Page action has no icons to show."; 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(EXTENSIONS_DEPRECATED): obsolete API. 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PageActionFunction::SetPageActionEnabled(bool enable) { 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string page_action_id; 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &page_action_id)); 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DictionaryValue* action; 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &action)); 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_id; 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(action->GetInteger(keys::kTabIdKey, &tab_id)); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string url; 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(action->GetString(keys::kUrlKey, &url)); 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string title; 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int icon_id = 0; 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (enable) { 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Both of those are optional. 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (action->HasKey(keys::kTitleKey)) 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(action->GetString(keys::kTitleKey, &title)); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (action->HasKey(keys::kIconIdKey)) { 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(action->GetInteger(keys::kIconIdKey, 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &icon_id)); 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionAction* page_action = GetExtension()->page_action(); 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!page_action) { 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch error_ = kNoPageActionError; 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (icon_id < 0 || 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<size_t>(icon_id) >= page_action->icon_paths()->size()) { 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch error_ = (icon_id == 0) ? kNoIconSpecified : kIconIndexOutOfBounds; 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Find the TabContents that contains this tab id. 73201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch TabContentsWrapper* contents = NULL; 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool result = ExtensionTabUtil::GetTabById( 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick tab_id, profile(), include_incognito(), NULL, NULL, &contents, NULL); 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!result || !contents) { 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick error_ = ExtensionErrorUtils::FormatErrorMessage( 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kNoTabError, base::IntToString(tab_id)); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure the URL hasn't changed. 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigationEntry* entry = contents->controller().GetActiveEntry(); 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!entry || url != entry->url().spec()) { 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch error_ = ExtensionErrorUtils::FormatErrorMessage(kUrlNotActiveError, url); 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set visibility and broadcast notifications that the UI should be updated. 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_action->SetIsVisible(tab_id, enable); 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_action->SetTitle(tab_id, title); 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_action->SetIconIndex(tab_id, icon_id); 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen contents->extension_tab_helper()->PageActionStateChanged(); 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PageActionFunction::InitCommon(int tab_id) { 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_action_ = GetExtension()->page_action(); 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!page_action_) { 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch error_ = kNoPageActionError; 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Find the TabContents that contains this tab id. 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch contents_ = NULL; 107201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch TabContentsWrapper* wrapper = NULL; 1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool result = ExtensionTabUtil::GetTabById( 109201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch tab_id, profile(), include_incognito(), NULL, NULL, &wrapper, NULL); 110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!result || !wrapper) { 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick error_ = ExtensionErrorUtils::FormatErrorMessage( 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kNoTabError, base::IntToString(tab_id)); 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen contents_ = wrapper; 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PageActionFunction::SetVisible(bool visible) { 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_id; 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &tab_id)); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!InitCommon(tab_id)) 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_action_->SetIsVisible(tab_id, visible); 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen contents_->extension_tab_helper()->PageActionStateChanged(); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool EnablePageActionFunction::RunImpl() { 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return SetPageActionEnabled(true); 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool DisablePageActionFunction::RunImpl() { 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return SetPageActionEnabled(false); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PageActionShowFunction::RunImpl() { 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return SetVisible(true); 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PageActionHideFunction::RunImpl() { 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return SetVisible(false); 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PageActionSetIconFunction::RunImpl() { 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DictionaryValue* args; 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_id; 1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(args->GetInteger("tabId", &tab_id)); 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!InitCommon(tab_id)) 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // setIcon can take a variant argument: either a canvas ImageData, or an 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // icon index. 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BinaryValue* binary; 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int icon_index; 1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (args->GetBinary("imageData", &binary)) { 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC::Message bitmap_pickle(binary->GetBuffer(), binary->GetSize()); 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void* iter = NULL; 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<SkBitmap> bitmap(new SkBitmap); 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE( 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC::ReadParam(&bitmap_pickle, &iter, bitmap.get())); 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_action_->SetIcon(tab_id, *bitmap); 1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (args->GetInteger("iconIndex", &icon_index)) { 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (icon_index < 0 || static_cast<size_t>(icon_index) >= 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_action_->icon_paths()->size()) { 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch error_ = kIconIndexOutOfBounds; 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_action_->SetIcon(tab_id, SkBitmap()); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_action_->SetIconIndex(tab_id, icon_index); 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(false); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen contents_->extension_tab_helper()->PageActionStateChanged(); 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PageActionSetTitleFunction::RunImpl() { 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DictionaryValue* args; 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_id; 1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(args->GetInteger("tabId", &tab_id)); 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!InitCommon(tab_id)) 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string title; 1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(args->GetString("title", &title)); 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_action_->SetTitle(tab_id, title); 196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen contents_->extension_tab_helper()->PageActionStateChanged(); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PageActionSetPopupFunction::RunImpl() { 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DictionaryValue* args; 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_id; 2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(args->GetInteger("tabId", &tab_id)); 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!InitCommon(tab_id)) 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(skerner): Consider allowing null and undefined to mean the popup 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // should be removed. 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string popup_string; 2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(args->GetString("popup", &popup_string)); 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL popup_url; 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!popup_string.empty()) 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch popup_url = GetExtension()->GetResourceURL(popup_string); 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_action_->SetPopupUrl(tab_id, popup_url); 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen contents_->extension_tab_helper()->PageActionStateChanged(); 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Not currently exposed to extensions. To re-enable, add mapping in 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// extension_function_dispatcher. 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PageActionSetBadgeBackgroundColorFunction::RunImpl() { 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DictionaryValue* args; 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_id; 2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(args->GetInteger("tabId", &tab_id)); 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!InitCommon(tab_id)) 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ListValue* color_value; 2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(args->GetList("color", &color_value)); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(color_value->GetSize() == 4); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int color_array[4] = {0}; 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < arraysize(color_array); ++i) 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(color_value->GetInteger(i, &color_array[i])); 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SkColor color = SkColorSetARGB(color_array[3], color_array[0], color_array[1], 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch color_array[2]); 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_action_->SetBadgeBackgroundColor(tab_id, color); 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen contents_->extension_tab_helper()->PageActionStateChanged(); 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Not currently exposed to extensions. To re-enable, add mapping in 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// extension_function_dispatcher. 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PageActionSetBadgeTextColorFunction::RunImpl() { 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DictionaryValue* args; 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_id; 2563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(args->GetInteger("tabId", &tab_id)); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!InitCommon(tab_id)) 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ListValue* color_value; 2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(args->GetList("color", &color_value)); 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(color_value->GetSize() == 4); 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int color_array[4] = {0}; 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < arraysize(color_array); ++i) 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(color_value->GetInteger(i, &color_array[i])); 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SkColor color = SkColorSetARGB(color_array[3], color_array[0], color_array[1], 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch color_array[2]); 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_action_->SetBadgeTextColor(tab_id, color); 271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen contents_->extension_tab_helper()->PageActionStateChanged(); 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Not currently exposed to extensions. To re-enable, add mapping in 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// extension_function_dispatcher. 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PageActionSetBadgeTextFunction::RunImpl() { 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DictionaryValue* args; 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_id; 2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(args->GetInteger("tabId", &tab_id)); 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!InitCommon(tab_id)) 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string text; 2873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(args->GetString("text", &text)); 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_action_->SetBadgeText(tab_id, text); 290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen contents_->extension_tab_helper()->PageActionStateChanged(); 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 293