15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/page_action_controller.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/browser_event_router.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/component_loader.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_action.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_action_manager.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_tab_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/tab_helper.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_id.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_set.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/invalidate_type.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PageActionController::PageActionController(content::WebContents* web_contents) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : content::WebContentsObserver(web_contents) {} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PageActionController::~PageActionController() {} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<ExtensionAction*> PageActionController::GetCurrentActions() const { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionService* service = GetExtensionService(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::vector<ExtensionAction*>(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accumulate the list of all page actions to display. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ExtensionAction*> current_actions; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionActionManager* extension_action_manager = 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionActionManager::Get(profile()); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ExtensionSet::const_iterator i = service->extensions()->begin(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != service->extensions()->end(); ++i) { 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ExtensionAction* action = 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extension_action_manager->GetPageAction(*i->get()); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (action) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_actions.push_back(action); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_actions; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocationBarController::Action PageActionController::OnClicked( 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, int mouse_button) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionService* service = GetExtensionService(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ACTION_NONE; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = service->extensions()->GetByID(extension_id); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(extension); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionAction* page_action = 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionActionManager::Get(profile())->GetPageAction(*extension); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(page_action); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tab_id = ExtensionTabUtil::GetTabId(web_contents()); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TabHelper::FromWebContents(web_contents())-> 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_tab_permission_granter()->GrantIfRequested(extension); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (mouse_button) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 1: // left 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 2: // middle 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_action->HasPopup(tab_id)) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ACTION_SHOW_POPUP; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->browser_event_router()->PageActionExecuted( 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile(), *page_action, tab_id, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetURL().spec(), mouse_button); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ACTION_NONE; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 3: // right 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension->ShowConfigureContextMenus() ? 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ACTION_SHOW_CONTEXT_MENU : ACTION_NONE; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ACTION_NONE; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PageActionController::NotifyChange() { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->NotifyNavigationStateChanged( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::INVALIDATE_TYPE_PAGE_ACTIONS); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PageActionController::DidNavigateMainFrame( 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::LoadCommittedDetails& details, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::FrameNavigateParams& params) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.is_in_page) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ExtensionAction*> current_actions = GetCurrentActions(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_actions.empty()) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < current_actions.size(); ++i) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_actions[i]->ClearAllValuesForTab( 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionID::IdForTab(web_contents())); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyChange(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* PageActionController::profile() const { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionService* PageActionController::GetExtensionService() const { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ExtensionSystem::Get(profile())->extension_service(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 121