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

Side by Side Diff: chrome/browser/ui/views/toolbar/browser_action_view.cc

Issue 411063003: Combine BrowserActionView and BrowserActionButton (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Nits 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
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/ui/views/toolbar/browser_action_view.h" 5 #include "chrome/browser/ui/views/toolbar/browser_action_view.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/browser/chrome_notification_types.h" 10 #include "chrome/browser/chrome_notification_types.h"
(...skipping 30 matching lines...) Expand all
41 const int kBorderInset = 4; 41 const int kBorderInset = 4;
42 42
43 } // namespace 43 } // namespace
44 44
45 //////////////////////////////////////////////////////////////////////////////// 45 ////////////////////////////////////////////////////////////////////////////////
46 // BrowserActionView 46 // BrowserActionView
47 47
48 BrowserActionView::BrowserActionView(const Extension* extension, 48 BrowserActionView::BrowserActionView(const Extension* extension,
49 Browser* browser, 49 Browser* browser,
50 BrowserActionView::Delegate* delegate) 50 BrowserActionView::Delegate* delegate)
51 : delegate_(delegate) {
52 set_id(VIEW_ID_BROWSER_ACTION);
53 button_.reset(new BrowserActionButton(extension, browser, delegate_));
54 button_->set_drag_controller(delegate_);
55 button_->set_owned_by_client();
56 AddChildView(button_.get());
57 button_->UpdateState();
58 }
59
60 BrowserActionView::~BrowserActionView() {
61 }
62
63 gfx::ImageSkia BrowserActionView::GetIconWithBadge() {
64 return button_->GetIconWithBadge();
65 }
66
67 void BrowserActionView::Layout() {
68 button_->SetBounds(0, 0, width(), height());
69 }
70
71 void BrowserActionView::GetAccessibleState(ui::AXViewState* state) {
72 state->name = l10n_util::GetStringUTF16(
73 IDS_ACCNAME_EXTENSIONS_BROWSER_ACTION);
74 state->role = ui::AX_ROLE_GROUP;
75 }
76
77 gfx::Size BrowserActionView::GetPreferredSize() const {
78 return gfx::Size(BrowserActionsContainer::IconWidth(false),
79 BrowserActionsContainer::IconHeight());
80 }
81
82 void BrowserActionView::PaintChildren(gfx::Canvas* canvas,
83 const views::CullSet& cull_set) {
84 View::PaintChildren(canvas, cull_set);
85 ExtensionAction* action = button_->extension_action();
86 int tab_id = button_->view_controller()->GetCurrentTabId();
87 if (tab_id >= 0)
88 action->PaintBadge(canvas, GetLocalBounds(), tab_id);
89 }
90
91 ////////////////////////////////////////////////////////////////////////////////
92 // BrowserActionButton
93
94 BrowserActionButton::BrowserActionButton(const Extension* extension,
95 Browser* browser,
96 BrowserActionView::Delegate* delegate)
97 : MenuButton(this, base::string16(), NULL, false), 51 : MenuButton(this, base::string16(), NULL, false),
98 view_controller_(new ExtensionActionViewController( 52 view_controller_(new ExtensionActionViewController(
99 extension, 53 extension,
100 browser, 54 browser,
101 extensions::ExtensionActionManager::Get(browser->profile())-> 55 extensions::ExtensionActionManager::Get(browser->profile())->
102 GetBrowserAction(*extension), 56 GetBrowserAction(*extension),
103 this)), 57 this)),
104 delegate_(delegate), 58 delegate_(delegate),
105 called_registered_extension_command_(false), 59 called_registered_extension_command_(false),
106 icon_observer_(NULL) { 60 icon_observer_(NULL) {
61 set_id(VIEW_ID_BROWSER_ACTION);
107 SetHorizontalAlignment(gfx::ALIGN_CENTER); 62 SetHorizontalAlignment(gfx::ALIGN_CENTER);
108 set_context_menu_controller(view_controller_.get()); 63 set_context_menu_controller(view_controller_.get());
109 64 set_drag_controller(delegate_);
110 // No UpdateState() here because View hierarchy not setup yet. Our parent
111 // should call UpdateState() after creation.
112 65
113 content::NotificationSource notification_source = 66 content::NotificationSource notification_source =
114 content::Source<Profile>(browser->profile()->GetOriginalProfile()); 67 content::Source<Profile>(browser->profile()->GetOriginalProfile());
115 registrar_.Add(this, 68 registrar_.Add(this,
116 extensions::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED, 69 extensions::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED,
117 content::Source<ExtensionAction>(extension_action())); 70 content::Source<ExtensionAction>(extension_action()));
118 registrar_.Add(this, 71 registrar_.Add(this,
119 extensions::NOTIFICATION_EXTENSION_COMMAND_ADDED, 72 extensions::NOTIFICATION_EXTENSION_COMMAND_ADDED,
120 notification_source); 73 notification_source);
121 registrar_.Add(this, 74 registrar_.Add(this,
122 extensions::NOTIFICATION_EXTENSION_COMMAND_REMOVED, 75 extensions::NOTIFICATION_EXTENSION_COMMAND_REMOVED,
123 notification_source); 76 notification_source);
124 77
125 // We also listen for browser theme changes on linux because a switch from or 78 // We also listen for browser theme changes on linux because a switch from or
126 // to GTK requires that we regrab our browser action images. 79 // to GTK requires that we regrab our browser action images.
127 registrar_.Add( 80 registrar_.Add(
128 this, 81 this,
129 chrome::NOTIFICATION_BROWSER_THEME_CHANGED, 82 chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
130 content::Source<ThemeService>( 83 content::Source<ThemeService>(
131 ThemeServiceFactory::GetForProfile(browser->profile()))); 84 ThemeServiceFactory::GetForProfile(browser->profile())));
85
86 UpdateState();
132 } 87 }
133 88
134 void BrowserActionButton::ViewHierarchyChanged( 89 BrowserActionView::~BrowserActionView() {
90 }
91
92 void BrowserActionView::ViewHierarchyChanged(
135 const ViewHierarchyChangedDetails& details) { 93 const ViewHierarchyChangedDetails& details) {
136 if (details.is_add && !called_registered_extension_command_ && 94 if (details.is_add && !called_registered_extension_command_ &&
137 GetFocusManager()) { 95 GetFocusManager()) {
138 view_controller_->RegisterCommand(); 96 view_controller_->RegisterCommand();
139 called_registered_extension_command_ = true; 97 called_registered_extension_command_ = true;
140 } 98 }
141 99
142 MenuButton::ViewHierarchyChanged(details); 100 MenuButton::ViewHierarchyChanged(details);
143 } 101 }
144 102
145 void BrowserActionButton::OnDragDone() { 103 void BrowserActionView::OnDragDone() {
146 delegate_->OnBrowserActionViewDragDone(); 104 delegate_->OnBrowserActionViewDragDone();
147 } 105 }
148 106
149 void BrowserActionButton::GetAccessibleState(ui::AXViewState* state) { 107 gfx::Size BrowserActionView::GetPreferredSize() const {
108 return gfx::Size(BrowserActionsContainer::IconWidth(false),
109 BrowserActionsContainer::IconHeight());
110 }
111
112 void BrowserActionView::PaintChildren(gfx::Canvas* canvas,
113 const views::CullSet& cull_set) {
114 View::PaintChildren(canvas, cull_set);
115 int tab_id = view_controller_->GetCurrentTabId();
116 if (tab_id >= 0)
117 extension_action()->PaintBadge(canvas, GetLocalBounds(), tab_id);
118 }
119
120 void BrowserActionView::GetAccessibleState(ui::AXViewState* state) {
150 views::MenuButton::GetAccessibleState(state); 121 views::MenuButton::GetAccessibleState(state);
122 state->name = l10n_util::GetStringUTF16(
123 IDS_ACCNAME_EXTENSIONS_BROWSER_ACTION);
151 state->role = ui::AX_ROLE_BUTTON; 124 state->role = ui::AX_ROLE_BUTTON;
152 } 125 }
153 126
154 void BrowserActionButton::ButtonPressed(views::Button* sender, 127 void BrowserActionView::ButtonPressed(views::Button* sender,
155 const ui::Event& event) { 128 const ui::Event& event) {
156 view_controller_->ExecuteActionByUser(); 129 view_controller_->ExecuteActionByUser();
157 } 130 }
158 131
159 void BrowserActionButton::UpdateState() { 132 void BrowserActionView::UpdateState() {
160 int tab_id = view_controller_->GetCurrentTabId(); 133 int tab_id = view_controller_->GetCurrentTabId();
161 if (tab_id < 0) 134 if (tab_id < 0)
162 return; 135 return;
163 136
164 if (!IsEnabled(tab_id)) { 137 if (!IsEnabled(tab_id)) {
165 SetState(views::CustomButton::STATE_DISABLED); 138 SetState(views::CustomButton::STATE_DISABLED);
166 } else { 139 } else {
167 SetState(menu_visible_ ? 140 SetState(menu_visible_ ?
168 views::CustomButton::STATE_PRESSED : 141 views::CustomButton::STATE_PRESSED :
169 views::CustomButton::STATE_NORMAL); 142 views::CustomButton::STATE_NORMAL);
(...skipping 13 matching lines...) Expand all
183 gfx::ImageSkiaOperations::CreateSuperimposedImage(bg, icon)); 156 gfx::ImageSkiaOperations::CreateSuperimposedImage(bg, icon));
184 } 157 }
185 158
186 // If the browser action name is empty, show the extension name instead. 159 // If the browser action name is empty, show the extension name instead.
187 std::string title = extension_action()->GetTitle(tab_id); 160 std::string title = extension_action()->GetTitle(tab_id);
188 base::string16 name = 161 base::string16 name =
189 base::UTF8ToUTF16(title.empty() ? extension()->name() : title); 162 base::UTF8ToUTF16(title.empty() ? extension()->name() : title);
190 SetTooltipText(name); 163 SetTooltipText(name);
191 SetAccessibleName(name); 164 SetAccessibleName(name);
192 165
193 parent()->SchedulePaint(); 166 SchedulePaint();
194 } 167 }
195 168
196 bool BrowserActionButton::IsPopup() { 169 bool BrowserActionView::IsPopup() {
197 int tab_id = view_controller_->GetCurrentTabId(); 170 int tab_id = view_controller_->GetCurrentTabId();
198 return (tab_id < 0) ? false : extension_action()->HasPopup(tab_id); 171 return (tab_id < 0) ? false : extension_action()->HasPopup(tab_id);
199 } 172 }
200 173
201 void BrowserActionButton::Observe(int type, 174 void BrowserActionView::Observe(int type,
202 const content::NotificationSource& source, 175 const content::NotificationSource& source,
203 const content::NotificationDetails& details) { 176 const content::NotificationDetails& details) {
204 switch (type) { 177 switch (type) {
205 case extensions::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED: 178 case extensions::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED:
206 UpdateState(); 179 UpdateState();
207 // The browser action may have become visible/hidden so we need to make 180 // The browser action may have become visible/hidden so we need to make
208 // sure the state gets updated. 181 // sure the state gets updated.
209 delegate_->OnBrowserActionVisibilityChanged(); 182 delegate_->OnBrowserActionVisibilityChanged();
210 break; 183 break;
211 case extensions::NOTIFICATION_EXTENSION_COMMAND_ADDED: 184 case extensions::NOTIFICATION_EXTENSION_COMMAND_ADDED:
212 case extensions::NOTIFICATION_EXTENSION_COMMAND_REMOVED: { 185 case extensions::NOTIFICATION_EXTENSION_COMMAND_REMOVED: {
213 std::pair<const std::string, const std::string>* payload = 186 std::pair<const std::string, const std::string>* payload =
(...skipping 11 matching lines...) Expand all
225 } 198 }
226 case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: 199 case chrome::NOTIFICATION_BROWSER_THEME_CHANGED:
227 UpdateState(); 200 UpdateState();
228 break; 201 break;
229 default: 202 default:
230 NOTREACHED(); 203 NOTREACHED();
231 break; 204 break;
232 } 205 }
233 } 206 }
234 207
235 bool BrowserActionButton::Activate() { 208 bool BrowserActionView::Activate() {
236 if (!IsPopup()) 209 if (!IsPopup())
237 return true; 210 return true;
238 211
239 view_controller_->ExecuteActionByUser(); 212 view_controller_->ExecuteActionByUser();
240 213
241 // TODO(erikkay): Run a nested modal loop while the mouse is down to 214 // TODO(erikkay): Run a nested modal loop while the mouse is down to
242 // enable menu-like drag-select behavior. 215 // enable menu-like drag-select behavior.
243 216
244 // The return value of this method is returned via OnMousePressed. 217 // The return value of this method is returned via OnMousePressed.
245 // We need to return false here since we're handing off focus to another 218 // We need to return false here since we're handing off focus to another
246 // widget/view, and true will grab it right back and try to send events 219 // widget/view, and true will grab it right back and try to send events
247 // to us. 220 // to us.
248 return false; 221 return false;
249 } 222 }
250 223
251 bool BrowserActionButton::OnMousePressed(const ui::MouseEvent& event) { 224 bool BrowserActionView::OnMousePressed(const ui::MouseEvent& event) {
252 if (!event.IsRightMouseButton()) { 225 if (!event.IsRightMouseButton()) {
253 return IsPopup() ? MenuButton::OnMousePressed(event) : 226 return IsPopup() ? MenuButton::OnMousePressed(event) :
254 LabelButton::OnMousePressed(event); 227 LabelButton::OnMousePressed(event);
255 } 228 }
256 return false; 229 return false;
257 } 230 }
258 231
259 void BrowserActionButton::OnMouseReleased(const ui::MouseEvent& event) { 232 void BrowserActionView::OnMouseReleased(const ui::MouseEvent& event) {
260 if (IsPopup() || view_controller_->is_menu_running()) { 233 if (IsPopup() || view_controller_->is_menu_running()) {
261 // TODO(erikkay) this never actually gets called (probably because of the 234 // TODO(erikkay) this never actually gets called (probably because of the
262 // loss of focus). 235 // loss of focus).
263 MenuButton::OnMouseReleased(event); 236 MenuButton::OnMouseReleased(event);
264 } else { 237 } else {
265 LabelButton::OnMouseReleased(event); 238 LabelButton::OnMouseReleased(event);
266 } 239 }
267 } 240 }
268 241
269 void BrowserActionButton::OnMouseExited(const ui::MouseEvent& event) { 242 void BrowserActionView::OnMouseExited(const ui::MouseEvent& event) {
270 if (IsPopup() || view_controller_->is_menu_running()) 243 if (IsPopup() || view_controller_->is_menu_running())
271 MenuButton::OnMouseExited(event); 244 MenuButton::OnMouseExited(event);
272 else 245 else
273 LabelButton::OnMouseExited(event); 246 LabelButton::OnMouseExited(event);
274 } 247 }
275 248
276 bool BrowserActionButton::OnKeyReleased(const ui::KeyEvent& event) { 249 bool BrowserActionView::OnKeyReleased(const ui::KeyEvent& event) {
277 return IsPopup() ? MenuButton::OnKeyReleased(event) : 250 return IsPopup() ? MenuButton::OnKeyReleased(event) :
278 LabelButton::OnKeyReleased(event); 251 LabelButton::OnKeyReleased(event);
279 } 252 }
280 253
281 void BrowserActionButton::OnGestureEvent(ui::GestureEvent* event) { 254 void BrowserActionView::OnGestureEvent(ui::GestureEvent* event) {
282 if (IsPopup()) 255 if (IsPopup())
283 MenuButton::OnGestureEvent(event); 256 MenuButton::OnGestureEvent(event);
284 else 257 else
285 LabelButton::OnGestureEvent(event); 258 LabelButton::OnGestureEvent(event);
286 } 259 }
287 260
288 scoped_ptr<LabelButtonBorder> BrowserActionButton::CreateDefaultBorder() const { 261 scoped_ptr<LabelButtonBorder> BrowserActionView::CreateDefaultBorder() const {
289 scoped_ptr<LabelButtonBorder> border = LabelButton::CreateDefaultBorder(); 262 scoped_ptr<LabelButtonBorder> border = LabelButton::CreateDefaultBorder();
290 border->set_insets(gfx::Insets(kBorderInset, kBorderInset, 263 border->set_insets(gfx::Insets(kBorderInset, kBorderInset,
291 kBorderInset, kBorderInset)); 264 kBorderInset, kBorderInset));
292 return border.Pass(); 265 return border.Pass();
293 } 266 }
294 267
295 void BrowserActionButton::SetButtonPushed() { 268 void BrowserActionView::SetButtonPushed() {
296 SetState(views::CustomButton::STATE_PRESSED); 269 SetState(views::CustomButton::STATE_PRESSED);
297 menu_visible_ = true; 270 menu_visible_ = true;
298 } 271 }
299 272
300 void BrowserActionButton::SetButtonNotPushed() { 273 void BrowserActionView::SetButtonNotPushed() {
301 SetState(views::CustomButton::STATE_NORMAL); 274 SetState(views::CustomButton::STATE_NORMAL);
302 menu_visible_ = false; 275 menu_visible_ = false;
303 } 276 }
304 277
305 bool BrowserActionButton::IsEnabled(int tab_id) const { 278 bool BrowserActionView::IsEnabled(int tab_id) const {
306 return view_controller_->extension_action()->GetIsVisible(tab_id); 279 return view_controller_->extension_action()->GetIsVisible(tab_id);
307 } 280 }
308 281
309 gfx::ImageSkia BrowserActionButton::GetIconWithBadge() { 282 gfx::ImageSkia BrowserActionView::GetIconWithBadge() {
310 int tab_id = view_controller_->GetCurrentTabId(); 283 int tab_id = view_controller_->GetCurrentTabId();
311 gfx::Size spacing(0, ToolbarView::kVertSpacing); 284 gfx::Size spacing(0, ToolbarView::kVertSpacing);
312 gfx::ImageSkia icon = *view_controller_->GetIcon(tab_id).ToImageSkia(); 285 gfx::ImageSkia icon = *view_controller_->GetIcon(tab_id).ToImageSkia();
313 if (!IsEnabled(tab_id)) 286 if (!IsEnabled(tab_id))
314 icon = gfx::ImageSkiaOperations::CreateTransparentImage(icon, .25); 287 icon = gfx::ImageSkiaOperations::CreateTransparentImage(icon, .25);
315 return extension_action()->GetIconWithBadge(icon, tab_id, spacing); 288 return extension_action()->GetIconWithBadge(icon, tab_id, spacing);
316 } 289 }
317 290
318 gfx::ImageSkia BrowserActionButton::GetIconForTest() { 291 gfx::ImageSkia BrowserActionView::GetIconForTest() {
319 return GetImage(views::Button::STATE_NORMAL); 292 return GetImage(views::Button::STATE_NORMAL);
320 } 293 }
321 294
322 BrowserActionButton::~BrowserActionButton() { 295 void BrowserActionView::OnIconUpdated() {
323 }
324
325 void BrowserActionButton::OnIconUpdated() {
326 UpdateState(); 296 UpdateState();
327 if (icon_observer_) 297 if (icon_observer_)
328 icon_observer_->OnIconUpdated(GetIconWithBadge()); 298 icon_observer_->OnIconUpdated(GetIconWithBadge());
329 } 299 }
330 300
331 views::View* BrowserActionButton::GetAsView() { 301 views::View* BrowserActionView::GetAsView() {
332 return this; 302 return this;
333 } 303 }
334 304
335 bool BrowserActionButton::IsShownInMenu() { 305 bool BrowserActionView::IsShownInMenu() {
336 return delegate_->ShownInsideMenu(); 306 return delegate_->ShownInsideMenu();
337 } 307 }
338 308
339 views::FocusManager* BrowserActionButton::GetFocusManagerForAccelerator() { 309 views::FocusManager* BrowserActionView::GetFocusManagerForAccelerator() {
340 return GetFocusManager(); 310 return GetFocusManager();
341 } 311 }
342 312
343 views::Widget* BrowserActionButton::GetParentForContextMenu() { 313 views::Widget* BrowserActionView::GetParentForContextMenu() {
344 // RunMenuAt expects a nested menu to be parented by the same widget as the 314 // RunMenuAt expects a nested menu to be parented by the same widget as the
345 // already visible menu, in this case the Chrome menu. 315 // already visible menu, in this case the Chrome menu.
346 return delegate_->ShownInsideMenu() ? 316 return delegate_->ShownInsideMenu() ?
347 BrowserView::GetBrowserViewForBrowser(view_controller_->browser()) 317 BrowserView::GetBrowserViewForBrowser(view_controller_->browser())
348 ->toolbar()->app_menu()->GetWidget() : 318 ->toolbar()->app_menu()->GetWidget() :
349 GetWidget(); 319 GetWidget();
350 } 320 }
351 321
352 views::View* BrowserActionButton::GetReferenceViewForPopup() { 322 views::View* BrowserActionView::GetReferenceViewForPopup() {
353 // Browser actions in the overflow menu can still show popups, so we may need 323 // Browser actions in the overflow menu can still show popups, so we may need
354 // a reference view other than this button's parent. If so, use the overflow 324 // a reference view other than this button's parent. If so, use the overflow
355 // view. 325 // view.
356 return parent()->visible() ? this : delegate_->GetOverflowReferenceView(); 326 return visible() ? this : delegate_->GetOverflowReferenceView();
357 } 327 }
358 328
359 content::WebContents* BrowserActionButton::GetCurrentWebContents() { 329 content::WebContents* BrowserActionView::GetCurrentWebContents() {
360 return delegate_->GetCurrentWebContents(); 330 return delegate_->GetCurrentWebContents();
361 } 331 }
362 332
363 void BrowserActionButton::HideActivePopup() { 333 void BrowserActionView::HideActivePopup() {
364 delegate_->HideActivePopup(); 334 delegate_->HideActivePopup();
365 } 335 }
366 336
367 void BrowserActionButton::OnPopupShown(bool grant_tab_permissions) { 337 void BrowserActionView::OnPopupShown(bool grant_tab_permissions) {
368 delegate_->SetPopupOwner(this); 338 delegate_->SetPopupOwner(this);
369 if (grant_tab_permissions) 339 if (grant_tab_permissions)
370 SetButtonPushed(); 340 SetButtonPushed();
371 } 341 }
372 342
373 void BrowserActionButton::CleanupPopup() { 343 void BrowserActionView::CleanupPopup() {
374 // We need to do these actions synchronously (instead of closing and then 344 // We need to do these actions synchronously (instead of closing and then
375 // performing the rest of the cleanup in OnWidgetDestroyed()) because 345 // performing the rest of the cleanup in OnWidgetDestroyed()) because
376 // OnWidgetDestroyed() can be called asynchronously from Close(), and we need 346 // OnWidgetDestroyed() can be called asynchronously from Close(), and we need
377 // to keep the delegate's popup owner up-to-date. 347 // to keep the delegate's popup owner up-to-date.
378 SetButtonNotPushed(); 348 SetButtonNotPushed();
379 delegate_->SetPopupOwner(NULL); 349 delegate_->SetPopupOwner(NULL);
380 } 350 }
381 351
382 void BrowserActionButton::OnWillShowContextMenus() { 352 void BrowserActionView::OnWillShowContextMenus() {
383 SetButtonPushed(); 353 SetButtonPushed();
384 } 354 }
385 355
386 void BrowserActionButton::OnContextMenuDone() { 356 void BrowserActionView::OnContextMenuDone() {
387 SetButtonNotPushed(); 357 SetButtonNotPushed();
388 } 358 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/toolbar/browser_action_view.h ('k') | chrome/browser/ui/views/toolbar/browser_actions_container.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698