Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/api/extension_action/extension_action_api.h" | 5 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 163 if (GetBrowserActionVisibility(extension_id) == visible) | 163 if (GetBrowserActionVisibility(extension_id) == visible) |
| 164 return; | 164 return; |
| 165 | 165 |
| 166 GetExtensionPrefs()->UpdateExtensionPref(extension_id, | 166 GetExtensionPrefs()->UpdateExtensionPref(extension_id, |
| 167 kBrowserActionVisible, | 167 kBrowserActionVisible, |
| 168 new base::FundamentalValue(visible)); | 168 new base::FundamentalValue(visible)); |
| 169 FOR_EACH_OBSERVER(Observer, observers_, OnExtensionActionVisibilityChanged( | 169 FOR_EACH_OBSERVER(Observer, observers_, OnExtensionActionVisibilityChanged( |
| 170 extension_id, visible)); | 170 extension_id, visible)); |
| 171 } | 171 } |
| 172 | 172 |
| 173 ExtensionAction::ShowAction ExtensionActionAPI::ExecuteExtensionAction( | |
|
Devlin
2016/03/16 13:21:16
Pretty much just moved to ExtensionActionRunner::R
| |
| 174 const Extension* extension, | |
| 175 Browser* browser, | |
| 176 bool grant_active_tab_permissions) { | |
| 177 content::WebContents* web_contents = | |
| 178 browser->tab_strip_model()->GetActiveWebContents(); | |
| 179 if (!web_contents) | |
| 180 return ExtensionAction::ACTION_NONE; | |
| 181 | |
| 182 int tab_id = SessionTabHelper::IdForTab(web_contents); | |
| 183 | |
| 184 ExtensionActionRunner* action_runner = | |
| 185 ExtensionActionRunner::GetForWebContents(web_contents); | |
| 186 bool has_pending_scripts = false; | |
| 187 if (action_runner && action_runner->WantsToRun(extension)) | |
| 188 has_pending_scripts = true; | |
| 189 | |
| 190 // Grant active tab if appropriate. | |
| 191 if (grant_active_tab_permissions) { | |
| 192 TabHelper::FromWebContents(web_contents)->active_tab_permission_granter()-> | |
| 193 GrantIfRequested(extension); | |
| 194 } | |
| 195 | |
| 196 // If this was a request to run a script, it will have been run once active | |
| 197 // tab was granted. Return without executing the action, since we should only | |
| 198 // run pending scripts OR the extension action, not both. | |
| 199 if (has_pending_scripts) | |
| 200 return ExtensionAction::ACTION_NONE; | |
| 201 | |
| 202 ExtensionAction* extension_action = | |
| 203 ExtensionActionManager::Get(browser_context_)->GetExtensionAction( | |
| 204 *extension); | |
| 205 | |
| 206 // Anything that gets here should have a page or browser action. | |
| 207 DCHECK(extension_action); | |
| 208 if (!extension_action->GetIsVisible(tab_id)) | |
| 209 return ExtensionAction::ACTION_NONE; | |
| 210 | |
| 211 if (extension_action->HasPopup(tab_id)) | |
| 212 return ExtensionAction::ACTION_SHOW_POPUP; | |
| 213 | |
| 214 ExtensionActionExecuted(*extension_action, web_contents); | |
| 215 return ExtensionAction::ACTION_NONE; | |
| 216 } | |
| 217 | |
| 218 bool ExtensionActionAPI::ShowExtensionActionPopup( | 173 bool ExtensionActionAPI::ShowExtensionActionPopup( |
| 219 const Extension* extension, | 174 const Extension* extension, |
| 220 Browser* browser, | 175 Browser* browser, |
| 221 bool grant_active_tab_permissions) { | 176 bool grant_active_tab_permissions) { |
| 222 ExtensionAction* extension_action = | 177 ExtensionAction* extension_action = |
| 223 ExtensionActionManager::Get(browser_context_)->GetExtensionAction( | 178 ExtensionActionManager::Get(browser_context_)->GetExtensionAction( |
| 224 *extension); | 179 *extension); |
| 225 if (!extension_action) | 180 if (!extension_action) |
| 226 return false; | 181 return false; |
| 227 | 182 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 239 | 194 |
| 240 ToolbarActionsBar* toolbar_actions_bar = | 195 ToolbarActionsBar* toolbar_actions_bar = |
| 241 browser->window()->GetToolbarActionsBar(); | 196 browser->window()->GetToolbarActionsBar(); |
| 242 // ToolbarActionsBar could be null if, e.g., this is a popup window with no | 197 // ToolbarActionsBar could be null if, e.g., this is a popup window with no |
| 243 // toolbar. | 198 // toolbar. |
| 244 return toolbar_actions_bar && | 199 return toolbar_actions_bar && |
| 245 toolbar_actions_bar->ShowToolbarActionPopup( | 200 toolbar_actions_bar->ShowToolbarActionPopup( |
| 246 extension->id(), grant_active_tab_permissions); | 201 extension->id(), grant_active_tab_permissions); |
| 247 } | 202 } |
| 248 | 203 |
| 249 bool ExtensionActionAPI::PageActionWantsToRun( | |
| 250 const Extension* extension, | |
| 251 content::WebContents* web_contents) { | |
| 252 ExtensionAction* page_action = | |
| 253 ExtensionActionManager::Get(browser_context_)->GetPageAction(*extension); | |
| 254 return page_action && | |
| 255 page_action->GetIsVisible(SessionTabHelper::IdForTab(web_contents)); | |
| 256 } | |
| 257 | |
| 258 bool ExtensionActionAPI::HasBeenBlocked(const Extension* extension, | |
| 259 content::WebContents* web_contents) { | |
| 260 ExtensionActionRunner* action_runner = | |
| 261 ExtensionActionRunner::GetForWebContents(web_contents); | |
| 262 return action_runner && action_runner->WantsToRun(extension); | |
| 263 } | |
| 264 | |
| 265 void ExtensionActionAPI::NotifyChange(ExtensionAction* extension_action, | 204 void ExtensionActionAPI::NotifyChange(ExtensionAction* extension_action, |
| 266 content::WebContents* web_contents, | 205 content::WebContents* web_contents, |
| 267 content::BrowserContext* context) { | 206 content::BrowserContext* context) { |
| 268 FOR_EACH_OBSERVER( | 207 FOR_EACH_OBSERVER( |
| 269 Observer, | 208 Observer, |
| 270 observers_, | 209 observers_, |
| 271 OnExtensionActionUpdated(extension_action, web_contents, context)); | 210 OnExtensionActionUpdated(extension_action, web_contents, context)); |
| 272 | 211 |
| 273 if (extension_action->action_type() == ActionInfo::TYPE_PAGE) | 212 if (extension_action->action_type() == ActionInfo::TYPE_PAGE) |
| 274 NotifyPageActionsChanged(web_contents); | 213 NotifyPageActionsChanged(web_contents); |
| 275 } | 214 } |
| 276 | 215 |
| 216 void ExtensionActionAPI::DispatchExtensionActionClicked( | |
|
Devlin
2016/03/16 13:21:16
Copy-paste from ExtensionActionExecuted() below
| |
| 217 const ExtensionAction& extension_action, | |
| 218 WebContents* web_contents) { | |
| 219 events::HistogramValue histogram_value = events::UNKNOWN; | |
| 220 const char* event_name = NULL; | |
| 221 switch (extension_action.action_type()) { | |
| 222 case ActionInfo::TYPE_BROWSER: | |
| 223 histogram_value = events::BROWSER_ACTION_ON_CLICKED; | |
| 224 event_name = "browserAction.onClicked"; | |
| 225 break; | |
| 226 case ActionInfo::TYPE_PAGE: | |
| 227 histogram_value = events::PAGE_ACTION_ON_CLICKED; | |
| 228 event_name = "pageAction.onClicked"; | |
| 229 break; | |
| 230 case ActionInfo::TYPE_SYSTEM_INDICATOR: | |
| 231 // The System Indicator handles its own clicks. | |
| 232 NOTREACHED(); | |
| 233 break; | |
| 234 } | |
| 235 | |
| 236 if (event_name) { | |
| 237 scoped_ptr<base::ListValue> args(new base::ListValue()); | |
| 238 args->Append( | |
| 239 ExtensionTabUtil::CreateTabObject(web_contents)->ToValue().release()); | |
| 240 | |
| 241 DispatchEventToExtension(web_contents->GetBrowserContext(), | |
| 242 extension_action.extension_id(), histogram_value, | |
| 243 event_name, std::move(args)); | |
| 244 } | |
| 245 } | |
| 246 | |
| 277 void ExtensionActionAPI::ClearAllValuesForTab( | 247 void ExtensionActionAPI::ClearAllValuesForTab( |
| 278 content::WebContents* web_contents) { | 248 content::WebContents* web_contents) { |
| 279 DCHECK(web_contents); | 249 DCHECK(web_contents); |
| 280 int tab_id = SessionTabHelper::IdForTab(web_contents); | 250 int tab_id = SessionTabHelper::IdForTab(web_contents); |
| 281 content::BrowserContext* browser_context = web_contents->GetBrowserContext(); | 251 content::BrowserContext* browser_context = web_contents->GetBrowserContext(); |
| 282 const ExtensionSet& enabled_extensions = | 252 const ExtensionSet& enabled_extensions = |
| 283 ExtensionRegistry::Get(browser_context_)->enabled_extensions(); | 253 ExtensionRegistry::Get(browser_context_)->enabled_extensions(); |
| 284 ExtensionActionManager* action_manager = | 254 ExtensionActionManager* action_manager = |
| 285 ExtensionActionManager::Get(browser_context_); | 255 ExtensionActionManager::Get(browser_context_); |
| 286 | 256 |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 314 return; | 284 return; |
| 315 | 285 |
| 316 scoped_ptr<Event> event( | 286 scoped_ptr<Event> event( |
| 317 new Event(histogram_value, event_name, std::move(event_args))); | 287 new Event(histogram_value, event_name, std::move(event_args))); |
| 318 event->restrict_to_browser_context = context; | 288 event->restrict_to_browser_context = context; |
| 319 event->user_gesture = EventRouter::USER_GESTURE_ENABLED; | 289 event->user_gesture = EventRouter::USER_GESTURE_ENABLED; |
| 320 EventRouter::Get(context) | 290 EventRouter::Get(context) |
| 321 ->DispatchEventToExtension(extension_id, std::move(event)); | 291 ->DispatchEventToExtension(extension_id, std::move(event)); |
| 322 } | 292 } |
| 323 | 293 |
| 324 void ExtensionActionAPI::ExtensionActionExecuted( | |
| 325 const ExtensionAction& extension_action, | |
| 326 WebContents* web_contents) { | |
| 327 events::HistogramValue histogram_value = events::UNKNOWN; | |
| 328 const char* event_name = NULL; | |
| 329 switch (extension_action.action_type()) { | |
| 330 case ActionInfo::TYPE_BROWSER: | |
| 331 histogram_value = events::BROWSER_ACTION_ON_CLICKED; | |
| 332 event_name = "browserAction.onClicked"; | |
| 333 break; | |
| 334 case ActionInfo::TYPE_PAGE: | |
| 335 histogram_value = events::PAGE_ACTION_ON_CLICKED; | |
| 336 event_name = "pageAction.onClicked"; | |
| 337 break; | |
| 338 case ActionInfo::TYPE_SYSTEM_INDICATOR: | |
| 339 // The System Indicator handles its own clicks. | |
| 340 NOTREACHED(); | |
| 341 break; | |
| 342 } | |
| 343 | |
| 344 if (event_name) { | |
| 345 scoped_ptr<base::ListValue> args(new base::ListValue()); | |
| 346 args->Append( | |
| 347 ExtensionTabUtil::CreateTabObject(web_contents)->ToValue().release()); | |
| 348 | |
| 349 DispatchEventToExtension(web_contents->GetBrowserContext(), | |
| 350 extension_action.extension_id(), histogram_value, | |
| 351 event_name, std::move(args)); | |
| 352 } | |
| 353 } | |
| 354 | |
| 355 void ExtensionActionAPI::NotifyPageActionsChanged( | 294 void ExtensionActionAPI::NotifyPageActionsChanged( |
| 356 content::WebContents* web_contents) { | 295 content::WebContents* web_contents) { |
| 357 Browser* browser = chrome::FindBrowserWithWebContents(web_contents); | 296 Browser* browser = chrome::FindBrowserWithWebContents(web_contents); |
| 358 if (!browser) | 297 if (!browser) |
| 359 return; | 298 return; |
| 360 LocationBar* location_bar = | 299 LocationBar* location_bar = |
| 361 browser->window() ? browser->window()->GetLocationBar() : NULL; | 300 browser->window() ? browser->window()->GetLocationBar() : NULL; |
| 362 if (!location_bar) | 301 if (!location_bar) |
| 363 return; | 302 return; |
| 364 location_bar->UpdatePageActions(); | 303 location_bar->UpdatePageActions(); |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 693 if (host->extension_host_type() != VIEW_TYPE_EXTENSION_POPUP || | 632 if (host->extension_host_type() != VIEW_TYPE_EXTENSION_POPUP || |
| 694 host->extension()->id() != extension_->id()) | 633 host->extension()->id() != extension_->id()) |
| 695 return; | 634 return; |
| 696 | 635 |
| 697 SendResponse(true); | 636 SendResponse(true); |
| 698 response_sent_ = true; | 637 response_sent_ = true; |
| 699 registrar_.RemoveAll(); | 638 registrar_.RemoveAll(); |
| 700 } | 639 } |
| 701 | 640 |
| 702 } // namespace extensions | 641 } // namespace extensions |
| OLD | NEW |