| 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 |