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

Side by Side Diff: chrome/browser/ui/views/frame/browser_view.cc

Issue 23800003: Fixe use after free during destruction (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 3 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
« no previous file with comments | « no previous file | chrome/browser/ui/views/frame/browser_view_browsertest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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/views/frame/browser_view.h" 5 #include "chrome/browser/ui/views/frame/browser_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 if (tabstrip_) { 452 if (tabstrip_) {
453 tabstrip_->parent()->RemoveChildView(tabstrip_); 453 tabstrip_->parent()->RemoveChildView(tabstrip_);
454 if (browser_view_layout) 454 if (browser_view_layout)
455 browser_view_layout->set_tab_strip(NULL); 455 browser_view_layout->set_tab_strip(NULL);
456 delete tabstrip_; 456 delete tabstrip_;
457 tabstrip_ = NULL; 457 tabstrip_ = NULL;
458 } 458 }
459 // Child views maintain PrefMember attributes that point to 459 // Child views maintain PrefMember attributes that point to
460 // OffTheRecordProfile's PrefService which gets deleted by ~Browser. 460 // OffTheRecordProfile's PrefService which gets deleted by ~Browser.
461 RemoveAllChildViews(true); 461 RemoveAllChildViews(true);
462 toolbar_ = NULL;
462 463
463 // It is possible that we were forced-closed by the native view system and 464 // It is possible that we were forced-closed by the native view system and
464 // that tabs remain in the browser. Close any such remaining tabs. 465 // that tabs remain in the browser. Close any such remaining tabs. Detach
465 while (browser_->tab_strip_model()->count()) 466 // before destroying in hopes of avoiding less callbacks trying to access
466 delete browser_->tab_strip_model()->GetWebContentsAt(0); 467 // members since destroyed.
468 {
469 ScopedVector<content::WebContents> contents;
470 while (browser_->tab_strip_model()->count())
471 contents.push_back(browser_->tab_strip_model()->DetachWebContentsAt(0));
472 }
Avi (use Gerrit) 2013/09/04 21:10:45 Wow, this code is even sketchier than the code I w
467 473
468 // Explicitly set browser_ to NULL. 474 // Explicitly set browser_ to NULL.
469 browser_.reset(); 475 browser_.reset();
470 } 476 }
471 477
472 void BrowserView::Init(Browser* browser) { 478 void BrowserView::Init(Browser* browser) {
473 browser_.reset(browser); 479 browser_.reset(browser);
474 browser_->tab_strip_model()->AddObserver(this); 480 browser_->tab_strip_model()->AddObserver(this);
475 } 481 }
476 482
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after
956 focus_manager->ClearFocus(); 962 focus_manager->ClearFocus();
957 } 963 }
958 } 964 }
959 965
960 void BrowserView::UpdateReloadStopState(bool is_loading, bool force) { 966 void BrowserView::UpdateReloadStopState(bool is_loading, bool force) {
961 toolbar_->reload_button()->ChangeMode( 967 toolbar_->reload_button()->ChangeMode(
962 is_loading ? ReloadButton::MODE_STOP : ReloadButton::MODE_RELOAD, force); 968 is_loading ? ReloadButton::MODE_STOP : ReloadButton::MODE_RELOAD, force);
963 } 969 }
964 970
965 void BrowserView::UpdateToolbar(content::WebContents* contents) { 971 void BrowserView::UpdateToolbar(content::WebContents* contents) {
966 toolbar_->Update(contents); 972 // We may end up here during destruction.
973 if (toolbar_)
974 toolbar_->Update(contents);
967 } 975 }
968 976
969 void BrowserView::FocusToolbar() { 977 void BrowserView::FocusToolbar() {
970 // Temporarily reveal the top-of-window views (if not already revealed) so 978 // Temporarily reveal the top-of-window views (if not already revealed) so
971 // that the toolbar is visible and is considered focusable. If the 979 // that the toolbar is visible and is considered focusable. If the
972 // toolbar gains focus, |immersive_mode_controller_| will keep the 980 // toolbar gains focus, |immersive_mode_controller_| will keep the
973 // top-of-window views revealed. 981 // top-of-window views revealed.
974 scoped_ptr<ImmersiveRevealedLock> focus_reveal_lock( 982 scoped_ptr<ImmersiveRevealedLock> focus_reveal_lock(
975 immersive_mode_controller_->GetRevealedLock( 983 immersive_mode_controller_->GetRevealedLock(
976 ImmersiveModeController::ANIMATE_REVEAL_YES)); 984 ImmersiveModeController::ANIMATE_REVEAL_YES));
(...skipping 1689 matching lines...) Expand 10 before | Expand all | Expand 10 after
2666 // The +1 in the next line creates a 1-px gap between icon and arrow tip. 2674 // The +1 in the next line creates a 1-px gap between icon and arrow tip.
2667 gfx::Point icon_bottom(0, location_icon_view->GetImageBounds().bottom() - 2675 gfx::Point icon_bottom(0, location_icon_view->GetImageBounds().bottom() -
2668 LocationBarView::kIconInternalPadding + 1); 2676 LocationBarView::kIconInternalPadding + 1);
2669 ConvertPointToTarget(location_icon_view, this, &icon_bottom); 2677 ConvertPointToTarget(location_icon_view, this, &icon_bottom);
2670 gfx::Point infobar_top(0, infobar_container_->GetVerticalOverlap(NULL)); 2678 gfx::Point infobar_top(0, infobar_container_->GetVerticalOverlap(NULL));
2671 ConvertPointToTarget(infobar_container_, this, &infobar_top); 2679 ConvertPointToTarget(infobar_container_, this, &infobar_top);
2672 top_arrow_height = infobar_top.y() - icon_bottom.y(); 2680 top_arrow_height = infobar_top.y() - icon_bottom.y();
2673 } 2681 }
2674 return top_arrow_height; 2682 return top_arrow_height;
2675 } 2683 }
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/ui/views/frame/browser_view_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698