OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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/views/extensions/extension_shelf.h" | 5 #include "chrome/browser/views/extensions/extension_shelf.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "app/resource_bundle.h" | 9 #include "app/resource_bundle.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 gfx::Size GetPreferredSize() { return size(); } | 105 gfx::Size GetPreferredSize() { return size(); } |
106 | 106 |
107 private: | 107 private: |
108 DISALLOW_COPY_AND_ASSIGN(PlaceholderView); | 108 DISALLOW_COPY_AND_ASSIGN(PlaceholderView); |
109 }; | 109 }; |
110 | 110 |
111 // A wrapper class for the ExtensionHost displayed as a toolstrip. | 111 // A wrapper class for the ExtensionHost displayed as a toolstrip. |
112 // The class itself also acts as the View for the handle of the toolstrip | 112 // The class itself also acts as the View for the handle of the toolstrip |
113 // it represents. | 113 // it represents. |
114 class ExtensionShelf::Toolstrip : public views::View, | 114 class ExtensionShelf::Toolstrip : public views::View, |
115 public BrowserBubble::Delegate { | 115 public BrowserBubble::Delegate, |
| 116 public AnimationDelegate { |
116 public: | 117 public: |
117 Toolstrip(ExtensionShelf* shelf, ExtensionHost* host, | 118 Toolstrip(ExtensionShelf* shelf, ExtensionHost* host, |
118 const Extension::ToolstripInfo& info); | 119 const Extension::ToolstripInfo& info); |
119 virtual ~Toolstrip(); | 120 virtual ~Toolstrip(); |
120 | 121 |
| 122 // Convenience to calculate just the size of the handle. |
| 123 gfx::Size GetHandlePreferredSize(); |
| 124 |
121 // View | 125 // View |
122 virtual void Paint(gfx::Canvas* canvas); | 126 virtual void Paint(gfx::Canvas* canvas); |
123 virtual gfx::Size GetPreferredSize(); | 127 virtual gfx::Size GetPreferredSize(); |
124 virtual void Layout(); | 128 virtual void Layout(); |
125 virtual void OnMouseEntered(const views::MouseEvent& event); | 129 virtual void OnMouseEntered(const views::MouseEvent& event); |
126 virtual void OnMouseExited(const views::MouseEvent& event); | 130 virtual void OnMouseExited(const views::MouseEvent& event); |
127 virtual bool OnMousePressed(const views::MouseEvent& event); | 131 virtual bool OnMousePressed(const views::MouseEvent& event); |
128 virtual bool OnMouseDragged(const views::MouseEvent& event); | 132 virtual bool OnMouseDragged(const views::MouseEvent& event); |
129 virtual void OnMouseReleased(const views::MouseEvent& event, bool canceled); | 133 virtual void OnMouseReleased(const views::MouseEvent& event, bool canceled); |
130 virtual bool IsFocusable() const { return true; } | 134 virtual bool IsFocusable() const { return true; } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
174 void StopHandleTimer(); | 178 void StopHandleTimer(); |
175 | 179 |
176 // Expand / Collapse | 180 // Expand / Collapse |
177 void Expand(int height, const GURL& url); | 181 void Expand(int height, const GURL& url); |
178 void Collapse(const GURL& url); | 182 void Collapse(const GURL& url); |
179 | 183 |
180 // BrowserBubble::Delegate | 184 // BrowserBubble::Delegate |
181 virtual void BubbleBrowserWindowMoved(BrowserBubble* bubble); | 185 virtual void BubbleBrowserWindowMoved(BrowserBubble* bubble); |
182 virtual void BubbleBrowserWindowClosing(BrowserBubble* bubble); | 186 virtual void BubbleBrowserWindowClosing(BrowserBubble* bubble); |
183 | 187 |
| 188 // AnimationDelegate |
| 189 virtual void AnimationProgressed(const Animation* animation); |
| 190 virtual void AnimationEnded(const Animation* animation); |
| 191 |
184 private: | 192 private: |
185 // The actual renderer that this toolstrip contains. | 193 // The actual renderer that this toolstrip contains. |
186 ExtensionHost* host_; | 194 ExtensionHost* host_; |
187 | 195 |
188 // Manifest definition of this toolstrip. | 196 // Manifest definition of this toolstrip. |
189 Extension::ToolstripInfo info_; | 197 Extension::ToolstripInfo info_; |
190 | 198 |
191 // The handle is a BrowserBubble so that it can exist as an independent, | 199 // The handle is a BrowserBubble so that it can exist as an independent, |
192 // floating window. It also acts as the container for the ExtensionView when | 200 // floating window. It also acts as the container for the ExtensionView when |
193 // it's being dragged. | 201 // it's being dragged. |
194 scoped_ptr<BrowserBubble> handle_; | 202 scoped_ptr<BrowserBubble> handle_; |
195 | 203 |
196 // Used for drawing the name of the extension in the handle. | 204 // Used for drawing the name of the extension in the handle. |
197 scoped_ptr<views::Label> title_; | 205 scoped_ptr<views::Label> title_; |
198 | 206 |
199 // Pointer back to the containing shelf. | 207 // Pointer back to the containing shelf. |
200 ExtensionShelf* shelf_; | 208 ExtensionShelf* shelf_; |
201 | 209 |
202 // When dragging, a placeholder view is put into the shelf to hold space | 210 // When dragging, a placeholder view is put into the shelf to hold space |
203 // for the ExtensionView. This view is parent owned when it's in the view | 211 // for the ExtensionView. This view is parent owned when it's in the view |
204 // hierarchy, so there's no ownership issues here. | 212 // hierarchy, so there's no ownership issues here. |
205 PlaceholderView* placeholder_view_; | 213 PlaceholderView* placeholder_view_; |
206 | 214 |
207 // Current state of the toolstrip, currently can't both be expanded and | 215 // Current state of the toolstrip, currently can't both be expanded and |
208 // dragging. | 216 // dragging. |
209 // TODO(erikkay) Support dragging while expanded. | 217 // TODO(erikkay) Support dragging while expanded. |
210 bool dragging_; | 218 bool dragging_; |
211 bool expanded_; | 219 bool expanded_; |
212 | 220 |
| 221 // The target expanded height of the toolstrip (used for animation). |
| 222 int expanded_height_; |
| 223 |
213 // If dragging, where did the drag start from. | 224 // If dragging, where did the drag start from. |
214 gfx::Point initial_drag_location_; | 225 gfx::Point initial_drag_location_; |
215 | 226 |
216 // Timers for tracking mouse hovering. | 227 // Timers for tracking mouse hovering. |
217 ScopedRunnableMethodFactory<ExtensionShelf::Toolstrip> timer_factory_; | 228 ScopedRunnableMethodFactory<ExtensionShelf::Toolstrip> timer_factory_; |
218 | 229 |
| 230 // Animate opening and closing the mole. |
| 231 scoped_ptr<SlideAnimation> mole_animation_; |
| 232 |
219 DISALLOW_COPY_AND_ASSIGN(Toolstrip); | 233 DISALLOW_COPY_AND_ASSIGN(Toolstrip); |
220 }; | 234 }; |
221 | 235 |
222 ExtensionShelf::Toolstrip::Toolstrip(ExtensionShelf* shelf, | 236 ExtensionShelf::Toolstrip::Toolstrip(ExtensionShelf* shelf, |
223 ExtensionHost* host, | 237 ExtensionHost* host, |
224 const Extension::ToolstripInfo& info) | 238 const Extension::ToolstripInfo& info) |
225 : host_(host), | 239 : host_(host), |
226 info_(info), | 240 info_(info), |
227 shelf_(shelf), | 241 shelf_(shelf), |
228 placeholder_view_(NULL), | 242 placeholder_view_(NULL), |
229 dragging_(false), | 243 dragging_(false), |
230 expanded_(false), | 244 expanded_(false), |
231 ALLOW_THIS_IN_INITIALIZER_LIST(timer_factory_(this)) { | 245 ALLOW_THIS_IN_INITIALIZER_LIST(timer_factory_(this)) { |
232 DCHECK(host->view()); | 246 DCHECK(host->view()); |
233 // We're owned by shelf_, not the bubble that we get inserted in and out of. | 247 // We're owned by shelf_, not the bubble that we get inserted in and out of. |
234 SetParentOwned(false); | 248 SetParentOwned(false); |
235 | 249 |
| 250 mole_animation_.reset(new SlideAnimation(this)); |
| 251 |
236 std::wstring name = UTF8ToWide(host_->extension()->name()); | 252 std::wstring name = UTF8ToWide(host_->extension()->name()); |
237 // |title_| isn't actually put in the view hierarchy. We just use it | 253 // |title_| isn't actually put in the view hierarchy. We just use it |
238 // to draw in place. The reason for this is so that we can properly handle | 254 // to draw in place. The reason for this is so that we can properly handle |
239 // the various mouse events necessary for hovering and dragging. | 255 // the various mouse events necessary for hovering and dragging. |
240 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 256 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
241 title_.reset(new views::Label(name, rb.GetFont(ResourceBundle::BaseFont))); | 257 title_.reset(new views::Label(name, rb.GetFont(ResourceBundle::BaseFont))); |
242 title_->SetColor(kHandleTextColor); | 258 title_->SetColor(kHandleTextColor); |
243 title_->SetDrawHighlighted(true); | 259 title_->SetDrawHighlighted(true); |
244 title_->SetHighlightColor(kHandleTextHighlightColor); | 260 title_->SetHighlightColor(kHandleTextHighlightColor); |
245 title_->SetBounds(kHandlePadding, kHandlePadding, 100, 100); | 261 title_->SetBounds(kHandlePadding, kHandlePadding, 100, 100); |
(...skipping 22 matching lines...) Expand all Loading... |
268 // Draw the title using a Label as a stamp. | 284 // Draw the title using a Label as a stamp. |
269 // See constructor for comment about this. | 285 // See constructor for comment about this. |
270 title_->ProcessPaint(canvas); | 286 title_->ProcessPaint(canvas); |
271 | 287 |
272 if (dragging_) { | 288 if (dragging_) { |
273 // when we're dragging, draw the bottom border. | 289 // when we're dragging, draw the bottom border. |
274 canvas->FillRectInt(kBorderColor, 0, height() - 1, width(), 1); | 290 canvas->FillRectInt(kBorderColor, 0, height() - 1, width(), 1); |
275 } | 291 } |
276 } | 292 } |
277 | 293 |
278 gfx::Size ExtensionShelf::Toolstrip::GetPreferredSize() { | 294 gfx::Size ExtensionShelf::Toolstrip::GetHandlePreferredSize() { |
279 gfx::Size sz = title_->GetPreferredSize(); | 295 gfx::Size sz = title_->GetPreferredSize(); |
280 sz.set_width(std::max(view()->width(), sz.width())); | 296 sz.set_width(std::max(view()->width(), sz.width())); |
281 if (!expanded_) | 297 if (!expanded_) |
282 sz.Enlarge(2 + kHandlePadding * 2, kHandlePadding * 2); | 298 sz.Enlarge(2 + kHandlePadding * 2, kHandlePadding * 2); |
| 299 return sz; |
| 300 } |
| 301 |
| 302 gfx::Size ExtensionShelf::Toolstrip::GetPreferredSize() { |
| 303 gfx::Size sz = GetHandlePreferredSize(); |
283 if (dragging_ || expanded_) { | 304 if (dragging_ || expanded_) { |
284 gfx::Size extension_size = view()->GetPreferredSize(); | 305 gfx::Size extension_size = view()->GetPreferredSize(); |
285 sz.Enlarge(0, extension_size.height() + 2); | 306 sz.Enlarge(0, extension_size.height() + 2); |
286 } | 307 } |
287 return sz; | 308 return sz; |
288 } | 309 } |
289 | 310 |
290 void ExtensionShelf::Toolstrip::Layout() { | 311 void ExtensionShelf::Toolstrip::Layout() { |
291 if (dragging_ || expanded_) { | 312 if (dragging_ || expanded_) { |
292 int y = title_->bounds().bottom() + kHandlePadding + 1; | 313 int y = title_->bounds().bottom() + kHandlePadding + 1; |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
377 handle_->set_delegate(this); | 398 handle_->set_delegate(this); |
378 LayoutHandle(); | 399 LayoutHandle(); |
379 } | 400 } |
380 return handle_.get(); | 401 return handle_.get(); |
381 } | 402 } |
382 | 403 |
383 void ExtensionShelf::Toolstrip::LayoutHandle() { | 404 void ExtensionShelf::Toolstrip::LayoutHandle() { |
384 if (!handle_.get()) | 405 if (!handle_.get()) |
385 return; | 406 return; |
386 | 407 |
| 408 int handle_height; |
| 409 if (mole_animation_->IsAnimating()) { |
| 410 // We only want to animate the body of the mole window. When we're |
| 411 // expanding, this is everything except for the handle. When we're |
| 412 // collapsing, this is everything except for the handle and the toolstrip. |
| 413 // We subtract this amount from the target height, figure out the step in |
| 414 // the animation from the rest, and then add it back in. |
| 415 int handle_offset = shelf_->height(); |
| 416 if (!mole_animation_->IsShowing()) |
| 417 handle_offset += GetPreferredSize().height(); |
| 418 else |
| 419 handle_offset += GetHandlePreferredSize().height(); |
| 420 int h = expanded_height_ - handle_offset; |
| 421 handle_height = static_cast<int>(h * mole_animation_->GetCurrentValue()); |
| 422 handle_height += handle_offset; |
| 423 } else { |
| 424 handle_height = height(); |
| 425 } |
| 426 |
| 427 // Now figure out where to place the handle on the screen. Since it's a top- |
| 428 // level widget, we need to do some coordinate conversion to get this right. |
387 int handle_width = std::max(view()->width(), width()); | 429 int handle_width = std::max(view()->width(), width()); |
388 gfx::Point origin(-kToolstripPadding, -(height() + kToolstripPadding - 1)); | 430 gfx::Point origin(-kToolstripPadding, |
389 if (expanded_) { | 431 -(handle_height + kToolstripPadding - 1)); |
390 origin.set_y(GetShelfView()->height() - height()); | 432 if (expanded_ || mole_animation_->IsAnimating()) { |
| 433 origin.set_y(GetShelfView()->height() - handle_height); |
391 views::View::ConvertPointToView(GetShelfView(), shelf_->GetRootView(), | 434 views::View::ConvertPointToView(GetShelfView(), shelf_->GetRootView(), |
392 &origin); | 435 &origin); |
393 } else { | 436 } else { |
394 views::View::ConvertPointToWidget(view(), &origin); | 437 views::View::ConvertPointToWidget(view(), &origin); |
395 } | 438 } |
396 SetBounds(0, 0, handle_width, height()); | 439 SetBounds(0, 0, handle_width, height()); |
397 handle_->SetBounds(origin.x(), origin.y(), handle_width, height()); | 440 handle_->SetBounds(origin.x(), origin.y(), handle_width, handle_height); |
398 handle_->ResizeToView(); | |
399 } | 441 } |
400 | 442 |
401 void ExtensionShelf::Toolstrip::ChildPreferredSizeChanged(View* child) { | 443 void ExtensionShelf::Toolstrip::ChildPreferredSizeChanged(View* child) { |
402 if (child == view()) { | 444 if (child == view()) { |
403 child->SizeToPreferredSize(); | 445 child->SizeToPreferredSize(); |
404 Layout(); | 446 Layout(); |
| 447 LayoutHandle(); |
405 if (expanded_) { | 448 if (expanded_) { |
406 LayoutHandle(); | |
407 placeholder_view_->SetWidth(child->width()); | 449 placeholder_view_->SetWidth(child->width()); |
408 shelf_->Layout(); | 450 shelf_->Layout(); |
409 } | 451 } |
410 } | 452 } |
411 } | 453 } |
412 | 454 |
413 void ExtensionShelf::Toolstrip::BubbleBrowserWindowMoved( | 455 void ExtensionShelf::Toolstrip::BubbleBrowserWindowMoved( |
414 BrowserBubble* bubble) { | 456 BrowserBubble* bubble) { |
415 HideShelfHandle(0); | 457 HideShelfHandle(0); |
416 } | 458 } |
417 | 459 |
418 void ExtensionShelf::Toolstrip::BubbleBrowserWindowClosing( | 460 void ExtensionShelf::Toolstrip::BubbleBrowserWindowClosing( |
419 BrowserBubble* bubble) { | 461 BrowserBubble* bubble) { |
420 DoHideShelfHandle(); | 462 DoHideShelfHandle(); |
421 } | 463 } |
422 | 464 |
| 465 void ExtensionShelf::Toolstrip::AnimationProgressed( |
| 466 const Animation* animation) { |
| 467 LayoutHandle(); |
| 468 } |
| 469 |
| 470 void ExtensionShelf::Toolstrip::AnimationEnded(const Animation* animation) { |
| 471 LayoutHandle(); |
| 472 if (!expanded_) { |
| 473 // Must use the delay due to bug 18248. |
| 474 HideShelfHandle(kHideDelayMs * 2); |
| 475 AttachToShelf(false); |
| 476 } |
| 477 } |
| 478 |
423 void ExtensionShelf::Toolstrip::DetachFromShelf(bool browserDetach) { | 479 void ExtensionShelf::Toolstrip::DetachFromShelf(bool browserDetach) { |
424 DCHECK(handle_.get()); | 480 DCHECK(handle_.get()); |
425 DCHECK(!placeholder_view_); | 481 DCHECK(!placeholder_view_); |
426 if (browserDetach && handle_->attached()) | 482 if (browserDetach && handle_->attached()) |
427 handle_->DetachFromBrowser(); | 483 handle_->DetachFromBrowser(); |
428 | 484 |
429 // Construct a placeholder view to replace the view. | 485 // Construct a placeholder view to replace the view. |
430 placeholder_view_ = new PlaceholderView(); | 486 placeholder_view_ = new PlaceholderView(); |
431 placeholder_view_->SetBounds(view()->bounds()); | 487 placeholder_view_->SetBounds(view()->bounds()); |
432 shelf_->AddChildView(placeholder_view_); | 488 shelf_->AddChildView(placeholder_view_); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
491 expanded_ = true; | 547 expanded_ = true; |
492 view()->set_is_toolstrip(!expanded_); | 548 view()->set_is_toolstrip(!expanded_); |
493 | 549 |
494 bool navigate = (!url.is_empty() && url != host_->GetURL()); | 550 bool navigate = (!url.is_empty() && url != host_->GetURL()); |
495 if (navigate) | 551 if (navigate) |
496 host_->NavigateToURL(url); | 552 host_->NavigateToURL(url); |
497 | 553 |
498 StopHandleTimer(); | 554 StopHandleTimer(); |
499 DetachFromShelf(false); | 555 DetachFromShelf(false); |
500 | 556 |
| 557 mole_animation_->Show(); |
| 558 |
501 gfx::Size extension_size = view()->GetPreferredSize(); | 559 gfx::Size extension_size = view()->GetPreferredSize(); |
502 extension_size.set_height(height); | 560 extension_size.set_height(height); |
503 view()->SetPreferredSize(extension_size); | 561 view()->SetPreferredSize(extension_size); |
504 LayoutHandle(); | 562 expanded_height_ = GetPreferredSize().height(); |
505 | 563 |
506 // This is to prevent flickering as the page loads and lays out. | 564 // This is to prevent flickering as the page loads and lays out. |
507 // Once the navigation is finished, ExtensionView will wind up setting | 565 // Once the navigation is finished, ExtensionView will wind up setting |
508 // visibility to true. | 566 // visibility to true. |
509 if (navigate) | 567 if (navigate) |
510 view()->SetVisible(false); | 568 view()->SetVisible(false); |
511 } | 569 } |
512 | 570 |
513 void ExtensionShelf::Toolstrip::Collapse(const GURL& url) { | 571 void ExtensionShelf::Toolstrip::Collapse(const GURL& url) { |
514 DCHECK(expanded_); | 572 DCHECK(expanded_); |
515 expanded_ = false; | 573 expanded_ = false; |
516 view()->set_is_toolstrip(!expanded_); | 574 view()->set_is_toolstrip(!expanded_); |
517 | 575 |
| 576 mole_animation_->Hide(); |
| 577 |
518 gfx::Size extension_size = view()->GetPreferredSize(); | 578 gfx::Size extension_size = view()->GetPreferredSize(); |
519 extension_size.set_height(kToolstripHeight); | 579 extension_size.set_height(kToolstripHeight); |
520 view()->SetPreferredSize(extension_size); | 580 view()->SetPreferredSize(extension_size); |
521 AttachToShelf(false); | |
522 | 581 |
523 if (!url.is_empty() && url != host_->GetURL()) { | 582 if (!url.is_empty() && url != host_->GetURL()) { |
524 host_->NavigateToURL(url); | 583 host_->NavigateToURL(url); |
525 | 584 |
526 // This is to prevent flickering as the page loads and lays out. | 585 // This is to prevent flickering as the page loads and lays out. |
527 // Once the navigation is finished, ExtensionView will wind up setting | 586 // Once the navigation is finished, ExtensionView will wind up setting |
528 // visibility to true. | 587 // visibility to true. |
529 view()->SetVisible(false); | 588 view()->SetVisible(false); |
530 } | 589 } |
531 | |
532 // Must use the delay due to bug 18248. | |
533 HideShelfHandle(kHideDelayMs); | |
534 } | 590 } |
535 | 591 |
536 void ExtensionShelf::Toolstrip::ShowShelfHandle() { | 592 void ExtensionShelf::Toolstrip::ShowShelfHandle() { |
537 StopHandleTimer(); | 593 StopHandleTimer(); |
538 if (handle_visible()) | 594 if (handle_visible()) |
539 return; | 595 return; |
540 MessageLoop::current()->PostDelayedTask(FROM_HERE, | 596 MessageLoop::current()->PostDelayedTask(FROM_HERE, |
541 timer_factory_.NewRunnableMethod( | 597 timer_factory_.NewRunnableMethod( |
542 &ExtensionShelf::Toolstrip::DoShowShelfHandle), | 598 &ExtensionShelf::Toolstrip::DoShowShelfHandle), |
543 1000); | 599 1000); |
544 } | 600 } |
545 | 601 |
546 void ExtensionShelf::Toolstrip::HideShelfHandle(int delay_ms) { | 602 void ExtensionShelf::Toolstrip::HideShelfHandle(int delay_ms) { |
547 StopHandleTimer(); | 603 StopHandleTimer(); |
548 if (!handle_visible() || dragging_ || expanded_) | 604 if (!handle_visible() || dragging_ || expanded_ || |
| 605 mole_animation_->IsAnimating()) { |
549 return; | 606 return; |
| 607 } |
550 if (delay_ms) { | 608 if (delay_ms) { |
551 MessageLoop::current()->PostDelayedTask(FROM_HERE, | 609 MessageLoop::current()->PostDelayedTask(FROM_HERE, |
552 timer_factory_.NewRunnableMethod( | 610 timer_factory_.NewRunnableMethod( |
553 &ExtensionShelf::Toolstrip::DoHideShelfHandle), | 611 &ExtensionShelf::Toolstrip::DoHideShelfHandle), |
554 delay_ms); | 612 delay_ms); |
555 } else { | 613 } else { |
556 DoHideShelfHandle(); | 614 DoHideShelfHandle(); |
557 } | 615 } |
558 } | 616 } |
559 | 617 |
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1017 | 1075 |
1018 bool ExtensionShelf::IsAlwaysShown() { | 1076 bool ExtensionShelf::IsAlwaysShown() { |
1019 Profile* profile = browser_->profile(); | 1077 Profile* profile = browser_->profile(); |
1020 return profile->GetPrefs()->GetBoolean(prefs::kShowExtensionShelf); | 1078 return profile->GetPrefs()->GetBoolean(prefs::kShowExtensionShelf); |
1021 } | 1079 } |
1022 | 1080 |
1023 bool ExtensionShelf::OnNewTabPage() { | 1081 bool ExtensionShelf::OnNewTabPage() { |
1024 return (browser_ && browser_->GetSelectedTabContents() && | 1082 return (browser_ && browser_->GetSelectedTabContents() && |
1025 browser_->GetSelectedTabContents()->IsExtensionShelfAlwaysVisible()); | 1083 browser_->GetSelectedTabContents()->IsExtensionShelfAlwaysVisible()); |
1026 } | 1084 } |
OLD | NEW |