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

Side by Side Diff: chrome/browser/ui/panels/panel.cc

Issue 10411036: Separate BrowserWindow from Panel class. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix mac unit_tests compile Created 8 years, 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/panels/panel.h" 5 #include "chrome/browser/ui/panels/panel.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "chrome/browser/profiles/profile.h" 9 #include "chrome/browser/profiles/profile.h"
10 #include "chrome/browser/ui/browser.h" 10 #include "chrome/browser/ui/browser.h"
11 #include "chrome/browser/ui/browser_finder.h"
12 #include "chrome/browser/ui/panels/native_panel.h" 11 #include "chrome/browser/ui/panels/native_panel.h"
12 #include "chrome/browser/ui/panels/panel_browser_window.h"
13 #include "chrome/browser/ui/panels/panel_manager.h" 13 #include "chrome/browser/ui/panels/panel_manager.h"
14 #include "chrome/browser/ui/panels/panel_strip.h" 14 #include "chrome/browser/ui/panels/panel_strip.h"
15 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
16 #include "chrome/browser/ui/tabs/tab_strip_model.h"
17 #include "chrome/browser/ui/window_sizer.h"
18 #include "chrome/common/chrome_notification_types.h" 15 #include "chrome/common/chrome_notification_types.h"
19 #include "content/public/browser/notification_service.h" 16 #include "content/public/browser/notification_service.h"
20 #include "content/public/browser/notification_source.h" 17 #include "content/public/browser/notification_source.h"
21 #include "content/public/browser/notification_types.h" 18 #include "content/public/browser/notification_types.h"
22 #include "content/public/browser/render_view_host.h" 19 #include "content/public/browser/render_view_host.h"
23 #include "content/public/browser/web_contents.h" 20 #include "content/public/browser/web_contents.h"
24 #include "ui/gfx/rect.h" 21 #include "ui/gfx/rect.h"
25 22
26 #if defined(USE_AURA)
27 #include "chrome/browser/ui/panels/panel_browser_view.h"
28 #endif
29
30 using content::NativeWebKeyboardEvent;
31 using content::RenderViewHost; 23 using content::RenderViewHost;
32 using content::SSLStatus;
33 using content::WebContents; 24 using content::WebContents;
34 25
35 Panel::Panel(Browser* browser, const gfx::Size& requested_size) 26 Panel::Panel(Browser* browser, const gfx::Size& requested_size)
36 : browser_(browser), 27 : browser_(browser),
37 panel_strip_(NULL), 28 panel_strip_(NULL),
38 initialized_(false), 29 initialized_(false),
39 full_size_(requested_size), 30 full_size_(requested_size),
40 max_size_policy_(DEFAULT_MAX_SIZE), 31 max_size_policy_(DEFAULT_MAX_SIZE),
41 auto_resizable_(false), 32 auto_resizable_(false),
42 always_on_top_(false), 33 always_on_top_(false),
43 in_preview_mode_(false), 34 in_preview_mode_(false),
44 native_panel_(NULL), 35 native_panel_(NULL),
45 attention_mode_(USE_PANEL_ATTENTION), 36 attention_mode_(USE_PANEL_ATTENTION),
46 expansion_state_(EXPANDED) { 37 expansion_state_(EXPANDED) {
47 } 38 }
48 39
49 Panel::~Panel() { 40 Panel::~Panel() {
50 // Invoked by native panel destructor. Do not access native_panel_ here. 41 // Invoked by native panel destructor. Do not access native_panel_ here.
51 } 42 }
52 43
53 void Panel::Initialize(const gfx::Rect& bounds) { 44 void Panel::Initialize(const gfx::Rect& bounds) {
54 DCHECK(!initialized_); 45 DCHECK(!initialized_);
55 DCHECK(!bounds.IsEmpty()); 46 DCHECK(!bounds.IsEmpty());
56 initialized_ = true; 47 initialized_ = true;
57 native_panel_ = CreateNativePanel(browser_, this, bounds); 48 native_panel_ = CreateNativePanel(browser_, this, bounds);
49 panel_browser_window_.reset(
50 new PanelBrowserWindow(browser_, this, native_panel_));
58 if (panel_strip_ != NULL) 51 if (panel_strip_ != NULL)
59 native_panel_->PreventActivationByOS(panel_strip_->IsPanelMinimized(this)); 52 native_panel_->PreventActivationByOS(panel_strip_->IsPanelMinimized(this));
60 } 53 }
61 54
62 void Panel::OnNativePanelClosed() { 55 void Panel::OnNativePanelClosed() {
63 if (auto_resizable_)
64 native_panel_->GetPanelBrowser()->tab_strip_model()->RemoveObserver(this);
65 manager()->OnPanelClosed(this); 56 manager()->OnPanelClosed(this);
66 DCHECK(!panel_strip_); 57 DCHECK(!panel_strip_);
67 } 58 }
68 59
69 PanelManager* Panel::manager() const { 60 PanelManager* Panel::manager() const {
70 return PanelManager::GetInstance(); 61 return PanelManager::GetInstance();
71 } 62 }
72 63
64 BrowserWindow* Panel::browser_window() const {
65 return panel_browser_window_.get();
66 }
67
73 bool Panel::CanMinimize() const { 68 bool Panel::CanMinimize() const {
74 return panel_strip_ && panel_strip_->CanMinimizePanel(this) && !IsMinimized(); 69 return panel_strip_ && panel_strip_->CanMinimizePanel(this) && !IsMinimized();
75 } 70 }
76 71
77 bool Panel::CanRestore() const { 72 bool Panel::CanRestore() const {
78 return panel_strip_ && panel_strip_->CanMinimizePanel(this) && IsMinimized(); 73 return panel_strip_ && panel_strip_->CanMinimizePanel(this) && IsMinimized();
79 } 74 }
80 75
81 panel::Resizability Panel::CanResizeByMouse() const { 76 panel::Resizability Panel::CanResizeByMouse() const {
82 if (!panel_strip_) 77 if (!panel_strip_)
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 full_size_ = ClampSize(full_size_); 119 full_size_ = ClampSize(full_size_);
125 } 120 }
126 121
127 void Panel::SetAutoResizable(bool resizable) { 122 void Panel::SetAutoResizable(bool resizable) {
128 if (auto_resizable_ == resizable) 123 if (auto_resizable_ == resizable)
129 return; 124 return;
130 125
131 auto_resizable_ = resizable; 126 auto_resizable_ = resizable;
132 WebContents* web_contents = browser()->GetSelectedWebContents(); 127 WebContents* web_contents = browser()->GetSelectedWebContents();
133 if (auto_resizable_) { 128 if (auto_resizable_) {
134 browser()->tab_strip_model()->AddObserver(this);
135 if (web_contents) 129 if (web_contents)
136 EnableWebContentsAutoResize(web_contents); 130 EnableWebContentsAutoResize(web_contents);
137 } else { 131 } else {
138 browser()->tab_strip_model()->RemoveObserver(this);
139 registrar_.RemoveAll(); 132 registrar_.RemoveAll();
140 133
141 if (web_contents) { 134 if (web_contents) {
142 // NULL might be returned if the tab has not been added. 135 // NULL might be returned if the tab has not been added.
143 RenderViewHost* render_view_host = web_contents->GetRenderViewHost(); 136 RenderViewHost* render_view_host = web_contents->GetRenderViewHost();
144 if (render_view_host) 137 if (render_view_host)
145 render_view_host->DisableAutoResize(full_size_); 138 render_view_host->DisableAutoResize(full_size_);
146 } 139 }
147 } 140 }
148 } 141 }
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 } 262 }
270 263
271 void Panel::Deactivate() { 264 void Panel::Deactivate() {
272 native_panel_->DeactivatePanel(); 265 native_panel_->DeactivatePanel();
273 } 266 }
274 267
275 bool Panel::IsActive() const { 268 bool Panel::IsActive() const {
276 return native_panel_->IsPanelActive(); 269 return native_panel_->IsPanelActive();
277 } 270 }
278 271
272 void Panel::SetDraggableRegion(SkRegion* region) {
273 }
274
279 void Panel::FlashFrame(bool draw_attention) { 275 void Panel::FlashFrame(bool draw_attention) {
280 if (IsDrawingAttention() == draw_attention || !panel_strip_) 276 if (IsDrawingAttention() == draw_attention || !panel_strip_)
281 return; 277 return;
282 278
283 // Don't draw attention for an active panel. 279 // Don't draw attention for an active panel.
284 if (draw_attention && IsActive()) 280 if (draw_attention && IsActive())
285 return; 281 return;
286 282
287 // Invoking native panel to draw attention must be done before informing the 283 // Invoking native panel to draw attention must be done before informing the
288 // panel strip because it needs to check internal state of the panel to 284 // panel strip because it needs to check internal state of the panel to
289 // determine if the panel has been drawing attention. 285 // determine if the panel has been drawing attention.
290 native_panel_->DrawAttention(draw_attention); 286 native_panel_->DrawAttention(draw_attention);
291 panel_strip_->OnPanelAttentionStateChanged(this); 287 panel_strip_->OnPanelAttentionStateChanged(this);
292 } 288 }
293 289
294 bool Panel::IsAlwaysOnTop() const { 290 bool Panel::IsAlwaysOnTop() const {
295 return always_on_top_; 291 return always_on_top_;
296 } 292 }
297 293
298 gfx::NativeWindow Panel::GetNativeHandle() {
299 return native_panel_->GetNativePanelHandle();
300 }
301
302 BrowserWindowTesting* Panel::GetBrowserWindowTesting() {
303 NOTIMPLEMENTED();
304 return NULL;
305 }
306
307 StatusBubble* Panel::GetStatusBubble() {
308 // TODO(jennb): Implement. http://crbug.com/102723
309 return NULL;
310 }
311
312 void Panel::ToolbarSizeChanged(bool is_animating){
313 NOTIMPLEMENTED();
314 }
315
316 void Panel::UpdateTitleBar() {
317 native_panel_->UpdatePanelTitleBar();
318 }
319
320 void Panel::BookmarkBarStateChanged(
321 BookmarkBar::AnimateChangeType change_type) {
322 NOTIMPLEMENTED();
323 }
324
325 void Panel::UpdateDevTools() {
326 NOTIMPLEMENTED();
327 }
328
329 void Panel::SetDevToolsDockSide(DevToolsDockSide side) {
330 NOTIMPLEMENTED();
331 }
332
333 void Panel::UpdateLoadingAnimations(bool should_animate) {
334 native_panel_->UpdatePanelLoadingAnimations(should_animate);
335 }
336
337 void Panel::SetStarredState(bool is_starred) {
338 // Since panels are typically not bookmarked extension UI windows, they don't
339 // have starred state.
340 }
341
342 gfx::Rect Panel::GetRestoredBounds() const { 294 gfx::Rect Panel::GetRestoredBounds() const {
343 gfx::Rect bounds = native_panel_->GetPanelBounds(); 295 gfx::Rect bounds = native_panel_->GetPanelBounds();
344 bounds.set_y(bounds.bottom() - full_size_.height()); 296 bounds.set_y(bounds.bottom() - full_size_.height());
345 bounds.set_x(bounds.right() - full_size_.width()); 297 bounds.set_x(bounds.right() - full_size_.width());
346 bounds.set_size(full_size_); 298 bounds.set_size(full_size_);
347 return bounds; 299 return bounds;
348 } 300 }
349 301
350 gfx::Rect Panel::GetBounds() const { 302 gfx::Rect Panel::GetBounds() const {
351 return native_panel_->GetPanelBounds(); 303 return native_panel_->GetPanelBounds();
(...skipping 23 matching lines...) Expand all
375 void Panel::Minimize() { 327 void Panel::Minimize() {
376 if (panel_strip_) 328 if (panel_strip_)
377 panel_strip_->MinimizePanel(this); 329 panel_strip_->MinimizePanel(this);
378 } 330 }
379 331
380 void Panel::Restore() { 332 void Panel::Restore() {
381 if (panel_strip_) 333 if (panel_strip_)
382 panel_strip_->RestorePanel(this); 334 panel_strip_->RestorePanel(this);
383 } 335 }
384 336
385 void Panel::EnterFullscreen(
386 const GURL& url, FullscreenExitBubbleType type) {
387 NOTIMPLEMENTED();
388 }
389
390 void Panel::ExitFullscreen() {
391 NOTIMPLEMENTED();
392 }
393
394 void Panel::UpdateFullscreenExitBubbleContent(
395 const GURL& url,
396 FullscreenExitBubbleType bubble_type) {
397 NOTIMPLEMENTED();
398 }
399
400 bool Panel::IsFullscreen() const { 337 bool Panel::IsFullscreen() const {
401 return false; 338 return false;
402 } 339 }
403 340
404 bool Panel::IsFullscreenBubbleVisible() const { 341 void Panel::OnWindowAutoResized(const gfx::Size& preferred_window_size) {
405 NOTIMPLEMENTED();
406 return false;
407 }
408
409 LocationBar* Panel::GetLocationBar() const {
410 #if defined(USE_AURA)
411 // TODO(stevenjb): Remove this when Aura panels are implemented post R18.
412 PanelBrowserView* panel_view = static_cast<PanelBrowserView*>(native_panel_);
413 return panel_view->GetLocationBar();
414 #else
415 // Panels do not have a location bar.
416 return NULL;
417 #endif
418 }
419
420 void Panel::SetFocusToLocationBar(bool select_all) {
421 #if defined(USE_AURA)
422 // TODO(stevenjb): Remove this when Aura panels are implemented post R18.
423 PanelBrowserView* panel_view = static_cast<PanelBrowserView*>(native_panel_);
424 panel_view->SetFocusToLocationBar(select_all);
425 #else
426 // Panels do not have a location bar.
427 #endif
428 }
429
430 void Panel::UpdateReloadStopState(bool is_loading, bool force) {
431 // Panels don't have stop/reload indicator.
432 }
433
434 void Panel::UpdateToolbar(TabContentsWrapper* contents,
435 bool should_restore_state) {
436 // Panels do not have a toolbar.
437 }
438
439 void Panel::FocusToolbar() {
440 // Panels do not have a toolbar.
441 }
442
443 void Panel::FocusAppMenu() {
444 NOTIMPLEMENTED();
445 }
446
447 void Panel::FocusBookmarksToolbar() {
448 NOTIMPLEMENTED();
449 }
450
451 void Panel::RotatePaneFocus(bool forwards) {
452 NOTIMPLEMENTED();
453 }
454
455 bool Panel::IsBookmarkBarVisible() const {
456 return false;
457 }
458
459 bool Panel::IsBookmarkBarAnimating() const {
460 return false;
461 }
462
463 // This is used by extensions to decide if a window can be closed.
464 // Always return true as panels do not have tabs that can be dragged,
465 // during which extensions will avoid closing a window.
466 bool Panel::IsTabStripEditable() const {
467 return true;
468 }
469
470 bool Panel::IsToolbarVisible() const {
471 NOTIMPLEMENTED();
472 return false;
473 }
474
475 gfx::Rect Panel::GetRootWindowResizerRect() const {
476 return gfx::Rect();
477 }
478
479 bool Panel::IsPanel() const {
480 return true;
481 }
482
483 void Panel::DisableInactiveFrame() {
484 NOTIMPLEMENTED();
485 }
486
487 void Panel::ConfirmAddSearchProvider(TemplateURL* template_url,
488 Profile* profile) {
489 NOTIMPLEMENTED();
490 }
491
492 void Panel::ToggleBookmarkBar() {
493 NOTIMPLEMENTED();
494 }
495
496 void Panel::ShowAboutChromeDialog() {
497 NOTIMPLEMENTED();
498 }
499
500 void Panel::ShowUpdateChromeDialog() {
501 NOTIMPLEMENTED();
502 }
503
504 void Panel::ShowTaskManager() {
505 native_panel_->ShowTaskManagerForPanel();
506 }
507
508 void Panel::ShowBackgroundPages() {
509 NOTIMPLEMENTED();
510 }
511
512 void Panel::ShowBookmarkBubble(const GURL& url, bool already_bookmarked) {
513 NOTIMPLEMENTED();
514 }
515
516 void Panel::ShowChromeToMobileBubble() {
517 NOTIMPLEMENTED();
518 }
519
520 #if defined(ENABLE_ONE_CLICK_SIGNIN)
521 void Panel::ShowOneClickSigninBubble(
522 const base::Closure& learn_more_callback,
523 const base::Closure& advanced_callback) {
524 NOTIMPLEMENTED();
525 }
526 #endif
527
528 bool Panel::IsDownloadShelfVisible() const {
529 return false;
530 }
531
532 DownloadShelf* Panel::GetDownloadShelf() {
533 Browser* panel_browser = native_panel_->GetPanelBrowser();
534 Profile* profile = panel_browser->profile();
535 Browser* tabbed_browser = browser::FindTabbedBrowser(profile, true);
536
537 if (!tabbed_browser) {
538 // Set initial bounds so window will not be positioned at an offset
539 // to this panel as panels are at the bottom of the screen.
540 gfx::Rect window_bounds;
541 WindowSizer::GetBrowserWindowBounds(std::string(), gfx::Rect(),
542 panel_browser, &window_bounds);
543 Browser::CreateParams params(Browser::TYPE_TABBED, profile);
544 params.initial_bounds = window_bounds;
545 tabbed_browser = Browser::CreateWithParams(params);
546 tabbed_browser->NewTab();
547 }
548
549 tabbed_browser->window()->Show(); // Ensure download shelf is visible.
550 return tabbed_browser->window()->GetDownloadShelf();
551 }
552
553 void Panel::ConfirmBrowserCloseWithPendingDownloads() {
554 NOTIMPLEMENTED();
555 }
556
557 void Panel::UserChangedTheme() {
558 native_panel_->NotifyPanelOnUserChangedTheme();
559 }
560
561 int Panel::GetExtraRenderViewHeight() const {
562 // This is currently used only on Linux and that returns the height for
563 // optional elements like bookmark bar, download bar etc. Not applicable to
564 // panels.
565 return 0;
566 }
567
568 void Panel::WebContentsFocused(WebContents* contents) {
569 native_panel_->PanelWebContentsFocused(contents);
570 }
571
572 void Panel::ShowPageInfo(Profile* profile,
573 const GURL& url,
574 const SSLStatus& ssl,
575 bool show_history) {
576 NOTIMPLEMENTED();
577 }
578 void Panel::ShowWebsiteSettings(Profile* profile,
579 TabContentsWrapper* tab_contents_wrapper,
580 const GURL& url,
581 const content::SSLStatus& ssl,
582 bool show_history) {
583 NOTIMPLEMENTED();
584 }
585
586 void Panel::ShowAppMenu() {
587 NOTIMPLEMENTED();
588 }
589
590 bool Panel::PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
591 bool* is_keyboard_shortcut) {
592 return native_panel_->PreHandlePanelKeyboardEvent(event,
593 is_keyboard_shortcut);
594 }
595
596 void Panel::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {
597 native_panel_->HandlePanelKeyboardEvent(event);
598 }
599
600 void Panel::ShowCreateWebAppShortcutsDialog(TabContentsWrapper* tab_contents) {
601 NOTIMPLEMENTED();
602 }
603
604 void Panel::ShowCreateChromeAppShortcutsDialog(Profile* profile,
605 const extensions::Extension* app) {
606 NOTIMPLEMENTED();
607 }
608
609 void Panel::Cut() {
610 native_panel_->PanelCut();
611 }
612
613 void Panel::Copy() {
614 native_panel_->PanelCopy();
615 }
616
617 void Panel::Paste() {
618 native_panel_->PanelPaste();
619 }
620
621 #if defined(OS_MACOSX)
622 void Panel::OpenTabpose() {
623 NOTIMPLEMENTED();
624 }
625
626 void Panel::EnterPresentationMode(
627 const GURL& url,
628 FullscreenExitBubbleType content_type) {
629 NOTIMPLEMENTED();
630 }
631
632 void Panel::ExitPresentationMode() {
633 NOTIMPLEMENTED();
634 }
635
636 bool Panel::InPresentationMode() {
637 NOTIMPLEMENTED();
638 return false;
639 }
640 #endif
641
642 void Panel::ShowInstant(TabContentsWrapper* preview) {
643 NOTIMPLEMENTED();
644 }
645
646 void Panel::HideInstant() {
647 NOTIMPLEMENTED();
648 }
649
650 gfx::Rect Panel::GetInstantBounds() {
651 NOTIMPLEMENTED();
652 return gfx::Rect();
653 }
654
655 WindowOpenDisposition Panel::GetDispositionForPopupBounds(
656 const gfx::Rect& bounds) {
657 #if defined(USE_AURA)
658 // TODO(stevenjb): Remove this when Aura panels are implemented post R18.
659 PanelBrowserView* panel_view = static_cast<PanelBrowserView*>(native_panel_);
660 return panel_view->GetDispositionForPopupBounds(bounds);
661 #else
662 return NEW_POPUP;
663 #endif
664 }
665
666 FindBar* Panel::CreateFindBar() {
667 return native_panel_->CreatePanelFindBar();
668 }
669
670 void Panel::ResizeDueToAutoResize(WebContents* web_contents,
671 const gfx::Size& pref_size) {
672 DCHECK(auto_resizable_); 342 DCHECK(auto_resizable_);
673 return manager()->OnWindowAutoResized( 343 if (panel_strip_)
674 this, 344 panel_strip_->ResizePanelWindow(this, preferred_window_size);
675 native_panel_->WindowSizeFromContentSize(pref_size));
676 }
677
678 void Panel::ShowAvatarBubble(WebContents* web_contents, const gfx::Rect& rect) {
679 // Panels will never show a new tab page so this should never be called.
680 NOTREACHED();
681 }
682
683 void Panel::ShowAvatarBubbleFromAvatarButton() {
684 // Panels will never show an avatar button so this should never be called.
685 NOTREACHED();
686 }
687
688 void Panel::TabInsertedAt(TabContentsWrapper* contents,
689 int index,
690 bool foreground) {
691 if (auto_resizable_) {
692 DCHECK_EQ(0, index);
693 EnableWebContentsAutoResize(contents->web_contents());
694 }
695 } 345 }
696 346
697 void Panel::EnableWebContentsAutoResize(WebContents* web_contents) { 347 void Panel::EnableWebContentsAutoResize(WebContents* web_contents) {
698 DCHECK(web_contents); 348 DCHECK(web_contents);
699 ConfigureAutoResize(web_contents); 349 ConfigureAutoResize(web_contents);
700 350
701 // We also need to know when the render view host changes in order 351 // We also need to know when the render view host changes in order
702 // to turn on auto-resize notifications in the new render view host. 352 // to turn on auto-resize notifications in the new render view host.
703 registrar_.RemoveAll(); // Stop notifications for previous contents, if any. 353 registrar_.RemoveAll(); // Stop notifications for previous contents, if any.
704 registrar_.Add( 354 registrar_.Add(
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
785 void Panel::OnPanelStartUserResizing() { 435 void Panel::OnPanelStartUserResizing() {
786 SetAutoResizable(false); 436 SetAutoResizable(false);
787 SetPreviewMode(true); 437 SetPreviewMode(true);
788 max_size_policy_ = CUSTOM_MAX_SIZE; 438 max_size_policy_ = CUSTOM_MAX_SIZE;
789 } 439 }
790 440
791 void Panel::OnPanelEndUserResizing() { 441 void Panel::OnPanelEndUserResizing() {
792 SetPreviewMode(false); 442 SetPreviewMode(false);
793 } 443 }
794 444
795 void Panel::DestroyBrowser() {
796 native_panel_->DestroyPanelBrowser();
797 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698