Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(472)

Side by Side Diff: chrome/browser/extensions/extension_browser_actions_api.cc

Issue 306044: Refactor implementation of BrowserActions, and add support for (Closed)
Patch Set: Make it work on linux too Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/extension_browser_actions_api.h" 5 #include "chrome/browser/extensions/extension_browser_actions_api.h"
6 6
7 #include "chrome/browser/browser.h" 7 #include "chrome/browser/browser.h"
8 #include "chrome/browser/browser_list.h" 8 #include "chrome/browser/browser_list.h"
9 #include "chrome/common/notification_service.h" 9 #include "chrome/common/notification_service.h"
10 #include "chrome/common/render_messages.h" 10 #include "chrome/common/render_messages.h"
11 11
12 namespace { 12 namespace {
13 // Errors. 13 // Errors.
14 const char kNoBrowserActionError[] = 14 const char kNoBrowserActionError[] =
15 "This extension has no browser action specified."; 15 "This extension has no browser action specified.";
16 const char kIconIndexOutOfBounds[] = 16 const char kIconIndexOutOfBounds[] =
17 "Browser action icon index out of bounds."; 17 "Browser action icon index out of bounds.";
18 } 18 }
19 19
20 bool BrowserActionSetIconFunction::RunImpl() { 20 bool BrowserActionFunction::RunImpl() {
21 EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); 21 EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY));
22 const DictionaryValue* args = static_cast<const DictionaryValue*>(args_); 22 details_ = static_cast<DictionaryValue*>(args_);
23
24 if (details_->HasKey(L"tabId"))
25 EXTENSION_FUNCTION_VALIDATE(details_->GetInteger(L"tabId", &tab_id_));
23 26
24 Extension* extension = dispatcher()->GetExtension(); 27 Extension* extension = dispatcher()->GetExtension();
25 if (!extension->browser_action()) { 28 browser_action_ = extension->browser_action();
29 if (!browser_action_) {
26 error_ = kNoBrowserActionError; 30 error_ = kNoBrowserActionError;
27 return false; 31 return false;
28 } 32 }
29 33
30 // setIcon can take a variant argument: either a canvas ImageData, or an 34 if (!RunBrowserAction())
31 // icon index. 35 return false;
32 BinaryValue* binary;
33 int icon_index;
34 if (args->GetBinary(L"imageData", &binary)) {
35 IPC::Message bitmap_pickle(binary->GetBuffer(), binary->GetSize());
36 void* iter = NULL;
37 scoped_ptr<SkBitmap> bitmap(new SkBitmap);
38 EXTENSION_FUNCTION_VALIDATE(
39 IPC::ReadParam(&bitmap_pickle, &iter, bitmap.get()));
40 extension->browser_action_state()->set_icon(bitmap.release());
41 } else if (args->GetInteger(L"iconIndex", &icon_index)) {
42 if (icon_index < 0 || static_cast<size_t>(icon_index) >=
43
44 extension->browser_action()->icon_paths().size()) {
45 error_ = kIconIndexOutOfBounds;
46 return false;
47 }
48 extension->browser_action_state()->set_icon_index(icon_index);
49 extension->browser_action_state()->set_icon(NULL);
50 } else {
51 EXTENSION_FUNCTION_VALIDATE(false);
52 }
53 36
54 NotificationService::current()->Notify( 37 NotificationService::current()->Notify(
55 NotificationType::EXTENSION_BROWSER_ACTION_UPDATED, 38 NotificationType::EXTENSION_BROWSER_ACTION_UPDATED,
56 Source<ExtensionAction>(extension->browser_action()), 39 Source<ExtensionAction2>(browser_action_),
57 Details<ExtensionActionState>(extension->browser_action_state())); 40 NotificationService::NoDetails());
58 return true; 41 return true;
59 } 42 }
60 43
61 bool BrowserActionSetTitleFunction::RunImpl() { 44 bool BrowserActionSetIconFunction::RunBrowserAction() {
62 EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); 45 BinaryValue* binary = NULL;
63 DictionaryValue* details = static_cast<DictionaryValue*>(args_); 46 EXTENSION_FUNCTION_VALIDATE(details_->GetBinary(L"imageData", &binary));
64 47 IPC::Message bitmap_pickle(binary->GetBuffer(), binary->GetSize());
65 std::string title; 48 void* iter = NULL;
66 EXTENSION_FUNCTION_VALIDATE(details->GetString(L"title", &title)); 49 SkBitmap bitmap;
67 50 EXTENSION_FUNCTION_VALIDATE(
68 Extension* extension = dispatcher()->GetExtension(); 51 IPC::ReadParam(&bitmap_pickle, &iter, &bitmap));
69 if (!extension->browser_action()) { 52 browser_action_->SetIcon(tab_id_, bitmap);
70 error_ = kNoBrowserActionError;
71 return false;
72 }
73
74 extension->browser_action_state()->set_title(title);
75
76 NotificationService::current()->Notify(
77 NotificationType::EXTENSION_BROWSER_ACTION_UPDATED,
78 Source<ExtensionAction>(extension->browser_action()),
79 Details<ExtensionActionState>(extension->browser_action_state()));
80 return true; 53 return true;
81 } 54 }
82 55
83 bool BrowserActionSetBadgeTextFunction::RunImpl() { 56 bool BrowserActionSetTitleFunction::RunBrowserAction() {
84 EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); 57 std::string title;
85 DictionaryValue* details = static_cast<DictionaryValue*>(args_); 58 EXTENSION_FUNCTION_VALIDATE(details_->GetString(L"title", &title));
86 59 browser_action_->SetTitle(tab_id_, title);
87 std::string badge_text;
88 EXTENSION_FUNCTION_VALIDATE(details->GetString(L"text", &badge_text));
89
90 Extension* extension = dispatcher()->GetExtension();
91 if (!extension->browser_action()) {
92 error_ = kNoBrowserActionError;
93 return false;
94 }
95
96 extension->browser_action_state()->set_badge_text(badge_text);
97
98 NotificationService::current()->Notify(
99 NotificationType::EXTENSION_BROWSER_ACTION_UPDATED,
100 Source<ExtensionAction>(extension->browser_action()),
101 Details<ExtensionActionState>(extension->browser_action_state()));
102 return true; 60 return true;
103 } 61 }
104 62
105 bool BrowserActionSetBadgeBackgroundColorFunction::RunImpl() { 63 bool BrowserActionSetBadgeTextFunction::RunBrowserAction() {
106 EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); 64 std::string badge_text;
107 DictionaryValue* details = static_cast<DictionaryValue*>(args_); 65 EXTENSION_FUNCTION_VALIDATE(details_->GetString(L"text", &badge_text));
66 browser_action_->SetBadgeText(tab_id_, badge_text);
67 return true;
68 }
108 69
70 bool BrowserActionSetBadgeBackgroundColorFunction::RunBrowserAction() {
109 ListValue* list = NULL; 71 ListValue* list = NULL;
110 EXTENSION_FUNCTION_VALIDATE(details->GetList(L"color", &list)); 72 EXTENSION_FUNCTION_VALIDATE(details_->GetList(L"color", &list));
111 EXTENSION_FUNCTION_VALIDATE(list->GetSize() == 4); 73 EXTENSION_FUNCTION_VALIDATE(list->GetSize() == 4);
112 74
113 int color_array[4] = {0}; 75 int color_array[4] = {0};
114 for (size_t i = 0; i < arraysize(color_array); ++i) { 76 for (size_t i = 0; i < arraysize(color_array); ++i) {
115 EXTENSION_FUNCTION_VALIDATE(list->GetInteger(i, &color_array[i])); 77 EXTENSION_FUNCTION_VALIDATE(list->GetInteger(i, &color_array[i]));
116 } 78 }
117 79
118 SkColor color = SkColorSetARGB(color_array[3], color_array[0], color_array[1], 80 SkColor color = SkColorSetARGB(color_array[3], color_array[0], color_array[1],
119 color_array[2]); 81 color_array[2]);
82 browser_action_->SetBadgeBackgroundColor(tab_id_, color);
120 83
121 Extension* extension = dispatcher()->GetExtension();
122 if (!extension->browser_action()) {
123 error_ = kNoBrowserActionError;
124 return false;
125 }
126
127 extension->browser_action_state()->set_badge_background_color(color);
128
129 NotificationService::current()->Notify(
130 NotificationType::EXTENSION_BROWSER_ACTION_UPDATED,
131 Source<ExtensionAction>(extension->browser_action()),
132 Details<ExtensionActionState>(extension->browser_action_state()));
133 return true; 84 return true;
134 } 85 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_browser_actions_api.h ('k') | chrome/browser/extensions/extension_file_util.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698