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