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_browser_actions_api.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <string>
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/values.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/render_messages.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Errors.
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kNoBrowserActionError[] =
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "This extension has no browser action specified.";
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kIconIndexOutOfBounds[] =
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "Browser action icon index out of bounds.";
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BrowserActionFunction::RunImpl() {
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details_));
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(details_ != NULL);
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (details_->HasKey("tabId"))
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXTENSION_FUNCTION_VALIDATE(details_->GetInteger("tabId", &tab_id_));
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* extension = GetExtension();
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_action_ = extension->browser_action();
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!browser_action_) {
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    error_ = kNoBrowserActionError;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!RunBrowserAction())
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationService::current()->Notify(
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationType::EXTENSION_BROWSER_ACTION_UPDATED,
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Source<ExtensionAction>(browser_action_),
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationService::NoDetails());
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BrowserActionSetIconFunction::RunBrowserAction() {
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BinaryValue* binary = NULL;
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXTENSION_FUNCTION_VALIDATE(details_->GetBinary("imageData", &binary));
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  IPC::Message bitmap_pickle(binary->GetBuffer(), binary->GetSize());
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void* iter = NULL;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkBitmap bitmap;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      IPC::ReadParam(&bitmap_pickle, &iter, &bitmap));
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_action_->SetIcon(tab_id_, bitmap);
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BrowserActionSetTitleFunction::RunBrowserAction() {
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string title;
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXTENSION_FUNCTION_VALIDATE(details_->GetString("title", &title));
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_action_->SetTitle(tab_id_, title);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BrowserActionSetPopupFunction::RunBrowserAction() {
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string popup_string;
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXTENSION_FUNCTION_VALIDATE(details_->GetString("popup", &popup_string));
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL popup_url;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!popup_string.empty())
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    popup_url = GetExtension()->GetResourceURL(popup_string);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_action_->SetPopupUrl(tab_id_, popup_url);
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BrowserActionSetBadgeTextFunction::RunBrowserAction() {
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string badge_text;
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXTENSION_FUNCTION_VALIDATE(details_->GetString("text", &badge_text));
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_action_->SetBadgeText(tab_id_, badge_text);
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BrowserActionSetBadgeBackgroundColorFunction::RunBrowserAction() {
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ListValue* list = NULL;
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXTENSION_FUNCTION_VALIDATE(details_->GetList("color", &list));
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(list->GetSize() == 4);
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int color_array[4] = {0};
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < arraysize(color_array); ++i) {
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXTENSION_FUNCTION_VALIDATE(list->GetInteger(i, &color_array[i]));
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkColor color = SkColorSetARGB(color_array[3], color_array[0], color_array[1],
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 color_array[2]);
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_action_->SetBadgeBackgroundColor(tab_id_, color);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
101