172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 24a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 34a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// found in the LICENSE file. 44a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 54a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#ifndef CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_PAGE_ACTION_IMAGE_VIEW_H_ 64a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#define CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_PAGE_ACTION_IMAGE_VIEW_H_ 74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#pragma once 84a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 94a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include <map> 104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include <string> 114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/extensions/image_loading_tracker.h" 144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/extensions/extension_context_menu_model.h" 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/extensions/extension_popup.h" 164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/controls/image_view.h" 174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass LocationBarView; 194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochnamespace views { 204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Menu2; 214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}; 224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// PageActionImageView is used by the LocationBarView to display the icon for a 244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// given PageAction and notify the extension when the icon is clicked. 254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass PageActionImageView : public views::ImageView, 264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public ImageLoadingTracker::Observer, 274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public ExtensionContextMenuModel::PopupDelegate, 284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public ExtensionPopup::Observer { 294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public: 304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch PageActionImageView(LocationBarView* owner, 314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Profile* profile, 324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ExtensionAction* page_action); 334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual ~PageActionImageView(); 344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ExtensionAction* page_action() { return page_action_; } 364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int current_tab_id() { return current_tab_id_; } 384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void set_preview_enabled(bool preview_enabled) { 404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch preview_enabled_ = preview_enabled; 414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overridden from view. 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnMouseReleased(const views::MouseEvent& event) OVERRIDE; 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool OnKeyPressed(const views::KeyEvent& event) OVERRIDE; 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void ShowContextMenu(const gfx::Point& p, 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool is_mouse_gesture) OVERRIDE; 504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overridden from ImageLoadingTracker. 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnImageLoaded(SkBitmap* image, 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const ExtensionResource& resource, 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int index) OVERRIDE; 554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overridden from ExtensionContextMenuModelModel::Delegate 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void InspectPopup(ExtensionAction* action) OVERRIDE; 584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overridden from ExtensionPopup::Observer 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void ExtensionPopupIsClosing(ExtensionPopup* popup) OVERRIDE; 614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Called to notify the PageAction that it should determine whether to be 634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // visible or hidden. |contents| is the TabContents that is active, |url| is 644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // the current page URL. 654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void UpdateVisibility(TabContents* contents, const GURL& url); 664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Either notify listeners or show a popup depending on the page action. 684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void ExecuteAction(int button, bool inspect_with_devtools); 694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private: 714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Hides the active popup, if there is one. 724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void HidePopup(); 734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The location bar view that owns us. 754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch LocationBarView* owner_; 764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The current profile (not owned by us). 784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Profile* profile_; 794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The PageAction that this view represents. The PageAction is not owned by 814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // us, it resides in the extension of this particular profile. 824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ExtensionAction* page_action_; 834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // A cache of bitmaps the page actions might need to show, mapped by path. 854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch typedef std::map<std::string, SkBitmap> PageActionMap; 864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch PageActionMap page_action_icons_; 874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The context menu for this page action. 894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<ExtensionContextMenuModel> context_menu_contents_; 904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_ptr<views::Menu2> context_menu_menu_; 914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The object that is waiting for the image loading to complete 934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // asynchronously. 944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ImageLoadingTracker tracker_; 954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The tab id we are currently showing the icon for. 974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int current_tab_id_; 984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The URL we are currently showing the icon for. 1004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch GURL current_url_; 1014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The string to show for a tooltip; 1034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string tooltip_; 1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // This is used for post-install visual feedback. The page_action icon is 1064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // briefly shown even if it hasn't been enabled by its extension. 1074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool preview_enabled_; 1084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The current popup and the button it came from. NULL if no popup. 1104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ExtensionPopup* popup_; 1114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(PageActionImageView); 1134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}; 1144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#endif // CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_PAGE_ACTION_IMAGE_VIEW_H_ 116