OLD | NEW |
| (Empty) |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/extensions/extension_toolstrip_api.h" | |
6 | |
7 #include "base/json/json_writer.h" | |
8 #include "base/string_util.h" | |
9 #include "chrome/browser/browser.h" | |
10 #include "chrome/browser/extensions/extension_host.h" | |
11 #include "chrome/browser/extensions/extension_message_service.h" | |
12 #include "chrome/browser/extensions/extension_shelf_model.h" | |
13 #include "chrome/browser/extensions/extension_tabs_module_constants.h" | |
14 #include "chrome/browser/profile.h" | |
15 #include "chrome/browser/renderer_host/render_view_host.h" | |
16 | |
17 namespace extension_toolstrip_api_events { | |
18 const char kOnToolstripExpanded[] = "toolstrip.onExpanded.%d"; | |
19 const char kOnToolstripCollapsed[] = "toolstrip.onCollapsed.%d"; | |
20 }; // namespace extension_toolstrip_api_events | |
21 | |
22 namespace { | |
23 // Errors. | |
24 const char kNotAToolstripError[] = "This page is not a toolstrip."; | |
25 const char kAlreadyExpandedError[] = "This toolstrip is already expanded."; | |
26 const char kAlreadyCollapsedError[] = "This toolstrip is already collapsed."; | |
27 const char kInvalidURLError[] = "Invalid URL"; | |
28 const char kBadHeightError[] = "Bad height."; | |
29 | |
30 // TODO(erikkay) what are good values here? | |
31 const int kMinHeight = 50; | |
32 const int kMaxHeight = 1000; | |
33 }; // namespace | |
34 | |
35 namespace keys = extension_tabs_module_constants; | |
36 namespace events = extension_toolstrip_api_events; | |
37 | |
38 bool ToolstripFunction::RunImpl() { | |
39 ViewType::Type view_type = | |
40 dispatcher()->render_view_host()->delegate()->GetRenderViewType(); | |
41 if (view_type != ViewType::EXTENSION_TOOLSTRIP && | |
42 view_type != ViewType::EXTENSION_MOLE) { | |
43 error_ = kNotAToolstripError; | |
44 return false; | |
45 } | |
46 | |
47 Browser* browser = GetCurrentBrowser(); | |
48 if (!browser) { | |
49 error_ = kNotAToolstripError; | |
50 return false; | |
51 } | |
52 | |
53 model_ = browser->extension_shelf_model(); | |
54 if (!model_) { | |
55 error_ = kNotAToolstripError; | |
56 return false; | |
57 } | |
58 | |
59 // Since this is an EXTENSION_TOOLSTRIP or EXTESION_MOLE view type, we know | |
60 // the delegate must be an ExtensionHost. | |
61 ExtensionHost* host = | |
62 static_cast<ExtensionHost*>(dispatcher()->delegate()); | |
63 toolstrip_ = model_->ToolstripForHost(host); | |
64 if (toolstrip_ == model_->end()) { | |
65 error_ = kNotAToolstripError; | |
66 return false; | |
67 } | |
68 | |
69 return true; | |
70 } | |
71 | |
72 bool ToolstripExpandFunction::RunImpl() { | |
73 if (!ToolstripFunction::RunImpl()) | |
74 return false; | |
75 if (toolstrip_->height != 0) { | |
76 error_ = kAlreadyExpandedError; | |
77 return false; | |
78 } | |
79 | |
80 DictionaryValue* args; | |
81 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); | |
82 | |
83 int height; | |
84 EXTENSION_FUNCTION_VALIDATE(args->GetInteger(keys::kHeightKey, | |
85 &height)); | |
86 EXTENSION_FUNCTION_VALIDATE(height >= 0); | |
87 if (height < kMinHeight || height > kMaxHeight) { | |
88 error_ = kBadHeightError; | |
89 return false; | |
90 } | |
91 | |
92 GURL url; | |
93 if (args->HasKey(keys::kUrlKey)) { | |
94 std::string url_string; | |
95 EXTENSION_FUNCTION_VALIDATE(args->GetString(keys::kUrlKey, | |
96 &url_string)); | |
97 url = dispatcher()->url().Resolve(url_string); | |
98 if (!url.is_valid()) { | |
99 error_ = kInvalidURLError; | |
100 return false; | |
101 } | |
102 } | |
103 | |
104 model_->ExpandToolstrip(toolstrip_, url, height); | |
105 return true; | |
106 } | |
107 | |
108 bool ToolstripCollapseFunction::RunImpl() { | |
109 if (!ToolstripFunction::RunImpl()) | |
110 return false; | |
111 | |
112 if (toolstrip_->height == 0) { | |
113 error_ = kAlreadyCollapsedError; | |
114 return false; | |
115 } | |
116 | |
117 GURL url; | |
118 if (HasOptionalArgument(0)) { | |
119 DictionaryValue* args; | |
120 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); | |
121 | |
122 if (args->HasKey(keys::kUrlKey)) { | |
123 std::string url_string; | |
124 EXTENSION_FUNCTION_VALIDATE(args->GetString(keys::kUrlKey, | |
125 &url_string)); | |
126 url = dispatcher()->url().Resolve(url_string); | |
127 if (!url.is_valid()) { | |
128 error_ = kInvalidURLError; | |
129 return false; | |
130 } | |
131 } | |
132 } | |
133 | |
134 model_->CollapseToolstrip(toolstrip_, url); | |
135 return true; | |
136 } | |
137 | |
138 // static | |
139 void ToolstripEventRouter::DispatchEvent(Profile *profile, | |
140 int routing_id, | |
141 const char *event_name, | |
142 const Value& json) { | |
143 if (profile->GetExtensionMessageService()) { | |
144 std::string json_args; | |
145 base::JSONWriter::Write(&json, false, &json_args); | |
146 std::string full_event_name = StringPrintf(event_name, routing_id); | |
147 profile->GetExtensionMessageService()->DispatchEventToRenderers( | |
148 full_event_name, json_args, profile->IsOffTheRecord(), GURL()); | |
149 } | |
150 } | |
151 | |
152 // static | |
153 void ToolstripEventRouter::OnToolstripExpanded(Profile* profile, | |
154 int routing_id, | |
155 const GURL &url, | |
156 int height) { | |
157 ListValue args; | |
158 DictionaryValue* obj = new DictionaryValue(); | |
159 if (!url.is_empty()) | |
160 obj->SetString(keys::kUrlKey, url.spec()); | |
161 obj->SetInteger(keys::kHeightKey, height); | |
162 args.Append(obj); | |
163 DispatchEvent(profile, routing_id, events::kOnToolstripExpanded, args); | |
164 } | |
165 | |
166 // static | |
167 void ToolstripEventRouter::OnToolstripCollapsed(Profile* profile, | |
168 int routing_id, | |
169 const GURL &url) { | |
170 ListValue args; | |
171 DictionaryValue* obj = new DictionaryValue(); | |
172 if (!url.is_empty()) | |
173 obj->SetString(keys::kUrlKey, url.spec()); | |
174 args.Append(obj); | |
175 DispatchEvent(profile, routing_id, events::kOnToolstripCollapsed, args); | |
176 } | |
OLD | NEW |