Chromium Code Reviews| Index: chrome/browser/extensions/api/extension_action/extension_actions_api.cc | 
| diff --git a/chrome/browser/extensions/api/extension_action/extension_actions_api.cc b/chrome/browser/extensions/api/extension_action/extension_actions_api.cc | 
| index c9c0b846c3a06060d89f27a2335328f93ac870cd..6817e491a3c897cfeaad4b59f41a205a2e312958 100644 | 
| --- a/chrome/browser/extensions/api/extension_action/extension_actions_api.cc | 
| +++ b/chrome/browser/extensions/api/extension_action/extension_actions_api.cc | 
| @@ -283,15 +283,19 @@ ExtensionActionFunction::~ExtensionActionFunction() { | 
| } | 
| bool ExtensionActionFunction::RunImpl() { | 
| - if (base::StringPiece(name()).starts_with("scriptBadge.")) { | 
| - extension_action_ = extensions::ExtensionActionManager::Get(profile_)-> | 
| - GetScriptBadge(*GetExtension()); | 
| + extensions::ExtensionActionManager* manager = | 
| + extensions::ExtensionActionManager::Get(profile_); | 
| + const extensions::Extension* extension = GetExtension(); | 
| + base::StringPiece functionName(name()); | 
| 
 
not at google - send to devlin
2012/11/26 19:44:54
chromium is unix_style not camelCase.
however, na
 
dewittj
2012/11/27 01:53:55
Done. StartsWithASCII added.
 
 | 
| + | 
| + if (functionName.starts_with("scriptBadge.")) { | 
| + extension_action_ = manager->GetScriptBadge(*extension); | 
| + } else if (functionName.starts_with("systemIndicator.")) { | 
| + extension_action_ = manager->GetSystemIndicator(*extension); | 
| } else { | 
| - extension_action_ = extensions::ExtensionActionManager::Get(profile_)-> | 
| - GetBrowserAction(*GetExtension()); | 
| + extension_action_ = manager->GetBrowserAction(*extension); | 
| if (!extension_action_) { | 
| - extension_action_ = extensions::ExtensionActionManager::Get(profile_)-> | 
| - GetPageAction(*GetExtension()); | 
| + extension_action_ = manager->GetPageAction(*extension); | 
| } | 
| } | 
| if (!extension_action_) { | 
| @@ -302,52 +306,11 @@ bool ExtensionActionFunction::RunImpl() { | 
| return false; | 
| } | 
| - // There may or may not be details (depends on the function). | 
| - // The tabId might appear in details (if it exists) or as the first | 
| - // argument besides the action type (depends on the function). | 
| - { | 
| - base::Value* first_arg = NULL; | 
| - EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &first_arg)); | 
| - | 
| - switch (first_arg->GetType()) { | 
| - case Value::TYPE_INTEGER: | 
| - CHECK(first_arg->GetAsInteger(&tab_id_)); | 
| - break; | 
| - | 
| - case Value::TYPE_DICTIONARY: { | 
| - details_ = static_cast<base::DictionaryValue*>(first_arg); | 
| - base::Value* tab_id_value = NULL; | 
| - if (details_->Get("tabId", &tab_id_value)) { | 
| - switch (tab_id_value->GetType()) { | 
| - case Value::TYPE_NULL: | 
| - // Fine, equivalent to it being not-there, and tabId is optional. | 
| - break; | 
| - case Value::TYPE_INTEGER: | 
| - CHECK(tab_id_value->GetAsInteger(&tab_id_)); | 
| - break; | 
| - default: | 
| - // Boom. | 
| - EXTENSION_FUNCTION_VALIDATE(false); | 
| - } | 
| - } | 
| - break; | 
| - } | 
| - | 
| - case Value::TYPE_NULL: | 
| - // The tabId might be an optional argument. | 
| - break; | 
| - | 
| - default: | 
| - EXTENSION_FUNCTION_VALIDATE(false); | 
| - } | 
| - } | 
| + // Populates the tab_id_ and details_ members. | 
| + EXTENSION_FUNCTION_VALIDATE(ExtractDataFromArguments()); | 
| // Find the WebContents that contains this tab id if one is required. | 
| - if (tab_id_ == ExtensionAction::kDefaultTabId) { | 
| - EXTENSION_FUNCTION_VALIDATE( | 
| - extensions::ExtensionActionManager::Get(profile_)-> | 
| - GetBrowserAction(*GetExtension())); | 
| - } else { | 
| + if (tab_id_ != ExtensionAction::kDefaultTabId) { | 
| ExtensionTabUtil::GetTabById( | 
| tab_id_, profile(), include_incognito(), NULL, NULL, &contents_, NULL); | 
| if (!contents_) { | 
| @@ -355,11 +318,69 @@ bool ExtensionActionFunction::RunImpl() { | 
| kNoTabError, base::IntToString(tab_id_)); | 
| return false; | 
| } | 
| - } | 
| + } else { | 
| + // Only browser actions and system indicators have a default tabId. | 
| + const extensions::Extension::ActionInfo::Type type_browser = | 
| + extensions::Extension::ActionInfo::TYPE_BROWSER; | 
| + const extensions::Extension::ActionInfo::Type type_system_indicator = | 
| + extensions::Extension::ActionInfo::TYPE_SYSTEM_INDICATOR; | 
| 
 
not at google - send to devlin
2012/11/26 19:44:54
this is just making it more verbose?
 
dewittj
2012/11/27 01:53:55
This is making it fit in the 80 column limit.  Rep
 
 | 
| + extensions::Extension::ActionInfo::Type action_type = | 
| + extension_action_->action_type(); | 
| + EXTENSION_FUNCTION_VALIDATE( | 
| + action_type == type_browser || action_type == type_system_indicator); | 
| + } | 
| return RunExtensionAction(); | 
| } | 
| +bool ExtensionActionFunction::ExtractDataFromArguments() { | 
| + // There may or may not be details (depends on the function). | 
| + // The tabId might appear in details (if it exists), as the first | 
| + // argument besides the action type (depends on the function), or be omitted | 
| + // entirely. | 
| + base::Value* first_arg = NULL; | 
| + if (!args_->Get(0, &first_arg)) { | 
| + return true; | 
| + } | 
| 
 
not at google - send to devlin
2012/11/26 19:44:54
generally leave out {} if it's just a 1 line body.
 
dewittj
2012/11/27 01:53:55
Done.
 
 | 
| + | 
| + switch (first_arg->GetType()) { | 
| + case Value::TYPE_INTEGER: | 
| + CHECK(first_arg->GetAsInteger(&tab_id_)); | 
| + break; | 
| + | 
| + case Value::TYPE_DICTIONARY: { | 
| + // Found the details argument. | 
| + details_ = static_cast<base::DictionaryValue*>(first_arg); | 
| + // Still need to check for the tabId within details. | 
| + base::Value* tab_id_value = NULL; | 
| + if (details_->Get("tabId", &tab_id_value)) { | 
| + switch (tab_id_value->GetType()) { | 
| + case Value::TYPE_NULL: | 
| + // OK; tabId is optional, leave it default. | 
| + return true; | 
| + case Value::TYPE_INTEGER: | 
| + CHECK(tab_id_value->GetAsInteger(&tab_id_)); | 
| + return true; | 
| + default: | 
| + // Boom. | 
| + return false; | 
| + } | 
| + } | 
| + // Not found; tabId is optional, leave it default. | 
| + break; | 
| + } | 
| + | 
| + case Value::TYPE_NULL: | 
| + // The tabId might be an optional argument. | 
| + break; | 
| + | 
| + default: | 
| + return false; | 
| + } | 
| + | 
| + return true; | 
| +} | 
| + | 
| void ExtensionActionFunction::NotifyChange() { | 
| switch (extension_action_->action_type()) { | 
| case extensions::Extension::ActionInfo::TYPE_BROWSER: | 
| @@ -375,6 +396,9 @@ void ExtensionActionFunction::NotifyChange() { | 
| case extensions::Extension::ActionInfo::TYPE_SCRIPT_BADGE: | 
| NotifyLocationBarChange(); | 
| return; | 
| + case extensions::Extension::ActionInfo::TYPE_SYSTEM_INDICATOR: | 
| + NotifyStatusTrayChange(); | 
| + return; | 
| } | 
| NOTREACHED(); | 
| } | 
| @@ -391,6 +415,11 @@ void ExtensionActionFunction::NotifyLocationBarChange() { | 
| location_bar_controller()->NotifyChange(); | 
| } | 
| +void ExtensionActionFunction::NotifyStatusTrayChange() { | 
| + // TODO(dewittj) Implement status tray behavior here. | 
| + // See http://crbug.com/142450. | 
| +} | 
| + | 
| // static | 
| bool ExtensionActionFunction::ParseCSSColorString( | 
| const std::string& color_string, |