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

Side by Side Diff: chrome/browser/sessions/session_restore.cc

Issue 299053002: Adds some debugging code for tracking down a crash (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/sessions/session_restore.h" 5 #include "chrome/browser/sessions/session_restore.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <list> 8 #include <list>
9 #include <set> 9 #include <set>
10 #include <string> 10 #include <string>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/bind_helpers.h" 13 #include "base/bind_helpers.h"
14 #include "base/callback.h" 14 #include "base/callback.h"
15 #include "base/command_line.h" 15 #include "base/command_line.h"
16 #include "base/debug/alias.h"
16 #include "base/memory/scoped_ptr.h" 17 #include "base/memory/scoped_ptr.h"
17 #include "base/memory/scoped_vector.h" 18 #include "base/memory/scoped_vector.h"
18 #include "base/metrics/histogram.h" 19 #include "base/metrics/histogram.h"
19 #include "base/run_loop.h" 20 #include "base/run_loop.h"
20 #include "base/stl_util.h" 21 #include "base/stl_util.h"
21 #include "base/strings/stringprintf.h" 22 #include "base/strings/stringprintf.h"
22 #include "base/task/cancelable_task_tracker.h" 23 #include "base/task/cancelable_task_tracker.h"
23 #include "chrome/browser/browser_process.h" 24 #include "chrome/browser/browser_process.h"
24 #include "chrome/browser/chrome_notification_types.h" 25 #include "chrome/browser/chrome_notification_types.h"
25 #include "chrome/browser/performance_monitor/startup_timer.h" 26 #include "chrome/browser/performance_monitor/startup_timer.h"
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 // Returns the RenderWidgetHost associated with a tab if there is one, 146 // Returns the RenderWidgetHost associated with a tab if there is one,
146 // NULL otherwise. 147 // NULL otherwise.
147 static RenderWidgetHost* GetRenderWidgetHost(NavigationController* tab); 148 static RenderWidgetHost* GetRenderWidgetHost(NavigationController* tab);
148 149
149 // Register for necessary notifications on a tab navigation controller. 150 // Register for necessary notifications on a tab navigation controller.
150 void RegisterForNotifications(NavigationController* controller); 151 void RegisterForNotifications(NavigationController* controller);
151 152
152 // Called when a tab goes away or a load completes. 153 // Called when a tab goes away or a load completes.
153 void HandleTabClosedOrLoaded(NavigationController* controller); 154 void HandleTabClosedOrLoaded(NavigationController* controller);
154 155
156 // TODO(sky): remove. For debugging 368236.
157 void CheckNotObserving(NavigationController* controller);
158
155 content::NotificationRegistrar registrar_; 159 content::NotificationRegistrar registrar_;
156 160
157 // Current delay before a new tab is loaded. See class description for 161 // Current delay before a new tab is loaded. See class description for
158 // details. 162 // details.
159 int64 force_load_delay_; 163 int64 force_load_delay_;
160 164
161 // Has Load been invoked? 165 // Has Load been invoked?
162 bool loading_; 166 bool loading_;
163 167
164 // Have we recorded the times for a tab paint? 168 // Have we recorded the times for a tab paint?
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 }; 200 };
197 201
198 // static 202 // static
199 TabLoader* TabLoader::GetTabLoader(base::TimeTicks restore_started) { 203 TabLoader* TabLoader::GetTabLoader(base::TimeTicks restore_started) {
200 if (!shared_tab_loader) 204 if (!shared_tab_loader)
201 shared_tab_loader = new TabLoader(restore_started); 205 shared_tab_loader = new TabLoader(restore_started);
202 return shared_tab_loader; 206 return shared_tab_loader;
203 } 207 }
204 208
205 void TabLoader::ScheduleLoad(NavigationController* controller) { 209 void TabLoader::ScheduleLoad(NavigationController* controller) {
210 CheckNotObserving(controller);
206 DCHECK(controller); 211 DCHECK(controller);
207 DCHECK(find(tabs_to_load_.begin(), tabs_to_load_.end(), controller) == 212 DCHECK(find(tabs_to_load_.begin(), tabs_to_load_.end(), controller) ==
208 tabs_to_load_.end()); 213 tabs_to_load_.end());
209 tabs_to_load_.push_back(controller); 214 tabs_to_load_.push_back(controller);
210 RegisterForNotifications(controller); 215 RegisterForNotifications(controller);
211 } 216 }
212 217
213 void TabLoader::TabIsLoading(NavigationController* controller) { 218 void TabLoader::TabIsLoading(NavigationController* controller) {
219 CheckNotObserving(controller);
214 DCHECK(controller); 220 DCHECK(controller);
215 DCHECK(find(tabs_loading_.begin(), tabs_loading_.end(), controller) == 221 DCHECK(find(tabs_loading_.begin(), tabs_loading_.end(), controller) ==
216 tabs_loading_.end()); 222 tabs_loading_.end());
217 tabs_loading_.insert(controller); 223 tabs_loading_.insert(controller);
218 RenderWidgetHost* render_widget_host = GetRenderWidgetHost(controller); 224 RenderWidgetHost* render_widget_host = GetRenderWidgetHost(controller);
219 DCHECK(render_widget_host); 225 DCHECK(render_widget_host);
220 render_widget_hosts_loading_.insert(render_widget_host); 226 render_widget_hosts_loading_.insert(render_widget_host);
221 RegisterForNotifications(controller); 227 RegisterForNotifications(controller);
222 } 228 }
223 229
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 base::TimeDelta::FromSeconds(100), 479 base::TimeDelta::FromSeconds(100),
474 100, 480 100,
475 base::Histogram::kUmaTargetedHistogramFlag); 481 base::Histogram::kUmaTargetedHistogramFlag);
476 counter_for_count->AddTime(time_to_load); 482 counter_for_count->AddTime(time_to_load);
477 483
478 UMA_HISTOGRAM_COUNTS_100("SessionRestore.ParallelTabLoads", 484 UMA_HISTOGRAM_COUNTS_100("SessionRestore.ParallelTabLoads",
479 max_parallel_tab_loads_); 485 max_parallel_tab_loads_);
480 } 486 }
481 } 487 }
482 488
489 void TabLoader::CheckNotObserving(NavigationController* controller) {
490 const bool in_tabs_to_load =
491 find(tabs_to_load_.begin(), tabs_to_load_.end(), controller) !=
492 tabs_to_load_.end();
marja 2014/05/23 08:30:43 Style nit, I find the shorter style more readable:
sky 2014/05/23 15:38:41 I agree with you, but find isn't on list, right?
marja 2014/05/27 07:54:55 Ahh, I see, I missed that it's a list.
493 const bool in_tabs_loading =
494 find(tabs_loading_.begin(), tabs_loading_.end(), controller) !=
495 tabs_loading_.end();
496 const bool observing =
497 registrar_.IsRegistered(
498 this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED,
499 content::Source<WebContents>(controller->GetWebContents())) ||
500 registrar_.IsRegistered(
501 this, content::NOTIFICATION_LOAD_STOP,
502 content::Source<NavigationController>(controller)) ||
503 registrar_.IsRegistered(
504 this, content::NOTIFICATION_LOAD_START,
505 content::Source<NavigationController>(controller));
506 base::debug::Alias(&in_tabs_to_load);
marja 2014/05/23 08:30:43 Wouldn't it be simpler to CHECK(!foo) for all the
sky 2014/05/23 15:38:41 I was tempted to do as you suggest, but that would
507 base::debug::Alias(&in_tabs_loading);
508 base::debug::Alias(&observing);
509 CHECK(!in_tabs_to_load && !in_tabs_loading && !observing);
510 }
511
483 // SessionRestoreImpl --------------------------------------------------------- 512 // SessionRestoreImpl ---------------------------------------------------------
484 513
485 // SessionRestoreImpl is responsible for fetching the set of tabs to create 514 // SessionRestoreImpl is responsible for fetching the set of tabs to create
486 // from SessionService. SessionRestoreImpl deletes itself when done. 515 // from SessionService. SessionRestoreImpl deletes itself when done.
487 516
488 class SessionRestoreImpl : public content::NotificationObserver { 517 class SessionRestoreImpl : public content::NotificationObserver {
489 public: 518 public:
490 SessionRestoreImpl(Profile* profile, 519 SessionRestoreImpl(Profile* profile,
491 Browser* browser, 520 Browser* browser,
492 chrome::HostDesktopType host_desktop_type, 521 chrome::HostDesktopType host_desktop_type,
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after
953 if (!restored_tab) 982 if (!restored_tab)
954 continue; 983 continue;
955 984
956 // If this isn't the selected tab, there's nothing else to do. 985 // If this isn't the selected tab, there's nothing else to do.
957 if (is_not_selected_tab) 986 if (is_not_selected_tab)
958 continue; 987 continue;
959 988
960 ShowBrowser( 989 ShowBrowser(
961 browser, 990 browser,
962 browser->tab_strip_model()->GetIndexOfWebContents(restored_tab)); 991 browser->tab_strip_model()->GetIndexOfWebContents(restored_tab));
992 // TODO(sky): remove. For debugging 368236.
993 CHECK_EQ(browser->tab_strip_model()->GetActiveWebContents(),
994 restored_tab);
963 tab_loader_->TabIsLoading(&browser->tab_strip_model() 995 tab_loader_->TabIsLoading(&browser->tab_strip_model()
964 ->GetActiveWebContents() 996 ->GetActiveWebContents()
965 ->GetController()); 997 ->GetController());
966 } 998 }
967 } else { 999 } else {
968 // If the browser already has tabs, we want to restore the new ones after 1000 // If the browser already has tabs, we want to restore the new ones after
969 // the existing ones. E.g. this happens in Win8 Metro where we merge 1001 // the existing ones. E.g. this happens in Win8 Metro where we merge
970 // windows or when launching a hosted app from the app launcher. 1002 // windows or when launching a hosted app from the app launcher.
971 int tab_index_offset = initial_tab_count; 1003 int tab_index_offset = initial_tab_count;
972 for (int i = 0; i < static_cast<int>(window.tabs.size()); ++i) { 1004 for (int i = 0; i < static_cast<int>(window.tabs.size()); ++i) {
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
1261 if (!active_session_restorers) 1293 if (!active_session_restorers)
1262 return false; 1294 return false;
1263 for (std::set<SessionRestoreImpl*>::const_iterator it = 1295 for (std::set<SessionRestoreImpl*>::const_iterator it =
1264 active_session_restorers->begin(); 1296 active_session_restorers->begin();
1265 it != active_session_restorers->end(); ++it) { 1297 it != active_session_restorers->end(); ++it) {
1266 if ((*it)->synchronous()) 1298 if ((*it)->synchronous())
1267 return true; 1299 return true;
1268 } 1300 }
1269 return false; 1301 return false;
1270 } 1302 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698