Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(424)

Side by Side Diff: chrome/browser/ui/views/extensions/extension_action_view.h

Issue 431173002: Create ExtensionActionView class (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 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 #ifndef CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_ACTION_VIEW_H_
6 #define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_ACTION_VIEW_H_
7
8 #include "chrome/browser/extensions/extension_action_icon_factory.h"
9 #include "chrome/browser/extensions/extension_context_menu_model.h"
10 #include "chrome/browser/ui/views/extensions/extension_popup.h"
11 #include "ui/gfx/image/image.h"
12 #include "ui/views/context_menu_controller.h"
13 #include "ui/views/widget/widget_observer.h"
14
15 class Browser;
16 class ExtensionAction;
17
18 namespace content {
19 class WebContents;
20 }
21
22 namespace extensions {
23 class Command;
24 class Extension;
25 }
26
27 namespace ui {
28 class Accelerator;
29 }
30
31 namespace views {
32 class MenuRunner;
33 class View;
34 class Widget;
35 }
36
37 // An abstract "View" for an ExtensionAction (either a BrowserAction or a
38 // PageAction). This contains the logic for showing the action's popup and
39 // the context menu. This class doesn't subclass View directly, as the
40 // implementations for page actions/browser actions are different types of
41 // views.
42 // All common logic for executing extension actions should go in this class;
sky 2014/08/05 22:29:46 No one is going to subclass this, right?
Devlin 2014/08/05 23:51:09 Correct. :)
43 // ViewDelegate classes should only have knowledge relating to the views::View
44 // wrapper.
45 class ExtensionActionView : public ExtensionActionIconFactory::Observer,
sky 2014/08/05 22:29:46 I don't like naming this class a View if its not a
Devlin 2014/08/05 23:51:10 I know :/ This was a desperate attempt at a name
46 public ExtensionContextMenuModel::PopupDelegate,
47 public views::ContextMenuController,
48 public views::WidgetObserver {
49 public:
50 class ViewDelegate {
sky 2014/08/05 22:29:46 I prefer this to live in its own file and be named
Devlin 2014/08/05 23:51:10 Ah, didn't know that - I think I've only seen dele
51 public:
52 virtual ~ViewDelegate() {}
sky 2014/08/05 22:29:46 make protected so that it's clear the delegate is
Devlin 2014/08/05 23:51:10 Done.
53
54 // Returns |this| as a view. We need this because our subclasses implement
55 // different kinds of views, and inheriting View here is a really bad idea.
56 virtual views::View* GetAsView() = 0;
57
58 // Returns true if this is a nested view.
sky 2014/08/05 22:29:47 What does 'nested' mean here?
Devlin 2014/08/05 23:51:10 Rephrased for clarity and correctness.
59 virtual bool IsNestedView() = 0;
60
61 // Returns the FocusManager to use when registering accelerators.
62 virtual views::FocusManager* GetFocusManagerForAccelerator() = 0;
63
64 // Returns the parent for the associated context menu.
65 virtual views::Widget* GetParentForContextMenu() = 0;
66
67 // Returns the reference view for the extension action's popup.
68 virtual views::View* GetReferenceViewForPopup() = 0;
69
70 // Returns the current web contents.
71 virtual content::WebContents* GetCurrentWebContents() = 0;
72
73 // Hides whatever popup is active (even if it's not this one).
74 virtual void HideActivePopup() = 0;
75
76 // Called when the icon is updated; this is forwarded from the icon factory.
77 virtual void OnIconUpdated() = 0;
78
79 // Called when a popup is shown. See ExecuteAction() for the definition of
80 // |grant_tab_permissions|.
81 virtual void OnPopupShown(bool grant_tab_permissions) {}
82
83 // Does any additional cleanup after the popup is closed.
84 virtual void CleanupPopup() {}
85
86 // Called immediately before the context menu is shown.
87 virtual void OnWillShowContextMenus() {}
88
89 // Called once the context menu has closed.
sky 2014/08/05 22:29:46 Make it clear this may not be called (if the conte
Devlin 2014/08/05 23:51:10 Done.
90 virtual void OnContextMenuDone() {}
91 };
92
93 ExtensionActionView(const extensions::Extension* extension,
94 Browser* browser,
95 ExtensionAction* extension_action,
96 ViewDelegate* delegate);
97 virtual ~ExtensionActionView();
98
99 // ExtensionContextMenuModel::PopupDelegate:
100 virtual void InspectPopup() OVERRIDE;
101
102 // Executes the default extension action (typically showing the popup), and
103 // attributes the action to a user (thus, only use this for actions that
104 // *were* done by the user).
105 void ExecuteActionByUser();
106
107 // Executes the extension action with |show_action|. If
108 // |grant_tab_permissions| is true, this will grant the extension active tab
109 // permissions. Only do this if this was done through a user action (and not
110 // e.g. an API). Returns true if a popup is shown.
111 bool ExecuteAction(ExtensionPopup::ShowAction show_action,
112 bool grant_tab_permissions);
113
114 // Hides the popup, if one is open.
115 void HidePopup();
116
117 // Returns the icon from the |icon_factory_|.
118 gfx::Image GetIcon(int tab_id);
119
120 // Returns the current tab id.
121 int GetCurrentTabId() const;
122
123 // Registers an accelerator for the extension action's command, if one
124 // exists.
125 void RegisterCommand();
126
127 // Unregisters the accelerator for the extension action's command, if one
128 // exists. If |only_if_removed| is true, then this will only unregister if the
129 // command has been removed.
130 void UnregisterCommand(bool only_if_removed);
131
132 // Handles the View::AcceleratorPressed method. Doesn't OVERRIDE because we
133 // don't actually derive from View here.
134 bool AcceleratorPressed(const ui::Accelerator& accelerator);
135
136 const extensions::Extension* extension() const { return extension_; }
137 Browser* browser() { return browser_; }
138 ExtensionAction* extension_action() { return extension_action_; }
139 const ExtensionAction* extension_action() const { return extension_action_; }
140 ExtensionPopup* popup() { return popup_; }
141 bool is_menu_running() const { return menu_runner_.get() != NULL; }
142
143 private:
144 // ExtensionActionIconFactory::Observer:
145 virtual void OnIconUpdated() OVERRIDE;
146
147 // views::WidgetObserver:
148 virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE;
149
150 // views::ContextMenuController:
151 virtual void ShowContextMenuForView(views::View* source,
152 const gfx::Point& point,
153 ui::MenuSourceType source_type) OVERRIDE;
154
155 // Shows the popup for the extension action, given the associated |popup_url|.
156 // Returns true if a popup is successfully shown.
157 bool ShowPopupWithUrl(ExtensionPopup::ShowAction show_action,
158 const GURL& popup_url);
159
160 // Populates |command| with the command associated with |extension|, if one
161 // exists. Returns true if |command| was populated.
162 bool GetExtensionCommand(extensions::Command* command);
163
164 // Cleans up after the popup. If |close_widget| is true, this will call
165 // Widget::Close() on the popup's widget; otherwise it assumes the popup is
166 // already closing.
167 void CleanupPopup(bool close_widget);
168
169 // The extension associated with the action we're displaying.
170 const extensions::Extension* extension_;
171
172 // The corresponding browser.
173 Browser* browser_;
174
175 // The browser action this view represents. The ExtensionAction is not owned
176 // by this class.
177 ExtensionAction* extension_action_;
178
179 // Our delegate.
180 ViewDelegate* delegate_;
181
182 // The object that will be used to get the browser action icon for us.
183 // It may load the icon asynchronously (in which case the initial icon
184 // returned by the factory will be transparent), so we have to observe it for
185 // updates to the icon.
186 ExtensionActionIconFactory icon_factory_;
187
188 // Responsible for running the menu.
189 scoped_ptr<views::MenuRunner> menu_runner_;
190
191 // The browser action's popup, if it is visible; NULL otherwise.
192 ExtensionPopup* popup_;
193
194 // The extension key binding accelerator this extension action is listening
195 // for (to show the popup).
196 scoped_ptr<ui::Accelerator> action_keybinding_;
197
198 DISALLOW_COPY_AND_ASSIGN(ExtensionActionView);
199 };
200
201 #endif // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_ACTION_VIEW_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698