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

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

Issue 7969009: Removed chromeos::NetworkStateNotifier and redirected all related code to use (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 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
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 <vector> 10 #include <vector>
(...skipping 16 matching lines...) Expand all
27 #include "chrome/browser/ui/browser_navigator.h" 27 #include "chrome/browser/ui/browser_navigator.h"
28 #include "chrome/browser/ui/browser_window.h" 28 #include "chrome/browser/ui/browser_window.h"
29 #include "chrome/common/chrome_notification_types.h" 29 #include "chrome/common/chrome_notification_types.h"
30 #include "content/browser/renderer_host/render_widget_host.h" 30 #include "content/browser/renderer_host/render_widget_host.h"
31 #include "content/browser/renderer_host/render_widget_host_view.h" 31 #include "content/browser/renderer_host/render_widget_host_view.h"
32 #include "content/browser/tab_contents/navigation_controller.h" 32 #include "content/browser/tab_contents/navigation_controller.h"
33 #include "content/browser/tab_contents/tab_contents.h" 33 #include "content/browser/tab_contents/tab_contents.h"
34 #include "content/browser/tab_contents/tab_contents_view.h" 34 #include "content/browser/tab_contents/tab_contents_view.h"
35 #include "content/common/notification_registrar.h" 35 #include "content/common/notification_registrar.h"
36 #include "content/common/notification_service.h" 36 #include "content/common/notification_service.h"
37 #include "net/base/network_change_notifier.h"
37 38
38 #if defined(OS_CHROMEOS) 39 #if defined(OS_CHROMEOS)
39 #include "chrome/browser/chromeos/boot_times_loader.h" 40 #include "chrome/browser/chromeos/boot_times_loader.h"
40 #include "chrome/browser/chromeos/network_state_notifier.h"
41 #endif 41 #endif
42 42
43 // Are we in the process of restoring? 43 // Are we in the process of restoring?
44 static bool restoring = false; 44 static bool restoring = false;
45 45
46 namespace { 46 namespace {
47 47
48 // TabLoader ------------------------------------------------------------------ 48 // TabLoader ------------------------------------------------------------------
49 49
50 // Initial delay (see class decription for details). 50 // Initial delay (see class decription for details).
51 static const int kInitialDelayTimerMS = 100; 51 static const int kInitialDelayTimerMS = 100;
52 52
53 // TabLoader is responsible for loading tabs after session restore creates 53 // TabLoader is responsible for loading tabs after session restore creates
54 // tabs. New tabs are loaded after the current tab finishes loading, or a delay 54 // tabs. New tabs are loaded after the current tab finishes loading, or a delay
55 // is reached (initially kInitialDelayTimerMS). If the delay is reached before 55 // is reached (initially kInitialDelayTimerMS). If the delay is reached before
56 // a tab finishes loading a new tab is loaded and the time of the delay 56 // a tab finishes loading a new tab is loaded and the time of the delay
57 // doubled. When all tabs are loading TabLoader deletes itself. 57 // doubled. When all tabs are loading TabLoader deletes itself.
58 // 58 //
59 // This is not part of SessionRestoreImpl so that synchronous destruction 59 // This is not part of SessionRestoreImpl so that synchronous destruction
60 // of SessionRestoreImpl doesn't have timing problems. 60 // of SessionRestoreImpl doesn't have timing problems.
61 class TabLoader : public NotificationObserver { 61 class TabLoader : public NotificationObserver,
62 public net::NetworkChangeNotifier::OnlineStateObserver {
62 public: 63 public:
63 explicit TabLoader(base::TimeTicks restore_started); 64 explicit TabLoader(base::TimeTicks restore_started);
64 ~TabLoader(); 65 virtual ~TabLoader();
65 66
66 // Schedules a tab for loading. 67 // Schedules a tab for loading.
67 void ScheduleLoad(NavigationController* controller); 68 void ScheduleLoad(NavigationController* controller);
68 69
69 // Notifies the loader that a tab has been scheduled for loading through 70 // Notifies the loader that a tab has been scheduled for loading through
70 // some other mechanism. 71 // some other mechanism.
71 void TabIsLoading(NavigationController* controller); 72 void TabIsLoading(NavigationController* controller);
72 73
73 // Invokes |LoadNextTab| to load a tab. 74 // Invokes |LoadNextTab| to load a tab.
74 // 75 //
75 // This must be invoked once to start loading. 76 // This must be invoked once to start loading.
76 void StartLoading(); 77 void StartLoading();
77 78
78 private: 79 private:
79 typedef std::set<NavigationController*> TabsLoading; 80 typedef std::set<NavigationController*> TabsLoading;
80 typedef std::list<NavigationController*> TabsToLoad; 81 typedef std::list<NavigationController*> TabsToLoad;
81 typedef std::set<RenderWidgetHost*> RenderWidgetHostSet; 82 typedef std::set<RenderWidgetHost*> RenderWidgetHostSet;
82 83
83 // Loads the next tab. If there are no more tabs to load this deletes itself, 84 // Loads the next tab. If there are no more tabs to load this deletes itself,
84 // otherwise |force_load_timer_| is restarted. 85 // otherwise |force_load_timer_| is restarted.
85 void LoadNextTab(); 86 void LoadNextTab();
86 87
87 // NotificationObserver method. Removes the specified tab and loads the next 88 // NotificationObserver method. Removes the specified tab and loads the next
88 // tab. 89 // tab.
89 virtual void Observe(int type, 90 virtual void Observe(int type,
90 const NotificationSource& source, 91 const NotificationSource& source,
91 const NotificationDetails& details); 92 const NotificationDetails& details) OVERRIDE;
93
94 // net::NetworkChangeNotifier::OnlineStateObserver overrides.
95 virtual void OnOnlineStateChanged(bool online) OVERRIDE;
92 96
93 // Removes the listeners from the specified tab and removes the tab from 97 // Removes the listeners from the specified tab and removes the tab from
94 // the set of tabs to load and list of tabs we're waiting to get a load 98 // the set of tabs to load and list of tabs we're waiting to get a load
95 // from. 99 // from.
96 void RemoveTab(NavigationController* tab); 100 void RemoveTab(NavigationController* tab);
97 101
98 // Invoked from |force_load_timer_|. Doubles |force_load_delay_| and invokes 102 // Invoked from |force_load_timer_|. Doubles |force_load_delay_| and invokes
99 // |LoadNextTab| to load the next tab 103 // |LoadNextTab| to load the next tab
100 void ForceLoadTimerFired(); 104 void ForceLoadTimerFired();
101 105
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 : force_load_delay_(kInitialDelayTimerMS), 153 : force_load_delay_(kInitialDelayTimerMS),
150 loading_(false), 154 loading_(false),
151 got_first_paint_(false), 155 got_first_paint_(false),
152 tab_count_(0), 156 tab_count_(0),
153 restore_started_(restore_started) { 157 restore_started_(restore_started) {
154 } 158 }
155 159
156 TabLoader::~TabLoader() { 160 TabLoader::~TabLoader() {
157 DCHECK((got_first_paint_ || render_widget_hosts_to_paint_.empty()) && 161 DCHECK((got_first_paint_ || render_widget_hosts_to_paint_.empty()) &&
158 tabs_loading_.empty() && tabs_to_load_.empty()); 162 tabs_loading_.empty() && tabs_to_load_.empty());
163 net::NetworkChangeNotifier::RemoveOnlineStateObserver(this);
159 } 164 }
160 165
161 void TabLoader::ScheduleLoad(NavigationController* controller) { 166 void TabLoader::ScheduleLoad(NavigationController* controller) {
162 DCHECK(controller); 167 DCHECK(controller);
163 DCHECK(find(tabs_to_load_.begin(), tabs_to_load_.end(), controller) == 168 DCHECK(find(tabs_to_load_.begin(), tabs_to_load_.end(), controller) ==
164 tabs_to_load_.end()); 169 tabs_to_load_.end());
165 tabs_to_load_.push_back(controller); 170 tabs_to_load_.push_back(controller);
166 RegisterForNotifications(controller); 171 RegisterForNotifications(controller);
167 } 172 }
168 173
169 void TabLoader::TabIsLoading(NavigationController* controller) { 174 void TabLoader::TabIsLoading(NavigationController* controller) {
170 DCHECK(controller); 175 DCHECK(controller);
171 DCHECK(find(tabs_loading_.begin(), tabs_loading_.end(), controller) == 176 DCHECK(find(tabs_loading_.begin(), tabs_loading_.end(), controller) ==
172 tabs_loading_.end()); 177 tabs_loading_.end());
173 tabs_loading_.insert(controller); 178 tabs_loading_.insert(controller);
174 RenderWidgetHost* render_widget_host = GetRenderWidgetHost(controller); 179 RenderWidgetHost* render_widget_host = GetRenderWidgetHost(controller);
175 DCHECK(render_widget_host); 180 DCHECK(render_widget_host);
176 render_widget_hosts_loading_.insert(render_widget_host); 181 render_widget_hosts_loading_.insert(render_widget_host);
177 RegisterForNotifications(controller); 182 RegisterForNotifications(controller);
178 } 183 }
179 184
180 void TabLoader::StartLoading() { 185 void TabLoader::StartLoading() {
181 registrar_.Add(this, content::NOTIFICATION_RENDER_WIDGET_HOST_DID_PAINT, 186 registrar_.Add(this, content::NOTIFICATION_RENDER_WIDGET_HOST_DID_PAINT,
182 NotificationService::AllSources()); 187 NotificationService::AllSources());
183 #if defined(OS_CHROMEOS) 188 #if defined(OS_CHROMEOS)
184 if (chromeos::NetworkStateNotifier::is_connected()) { 189 if (!net::NetworkChangeNotifier::IsOffline()) {
185 loading_ = true; 190 loading_ = true;
186 LoadNextTab(); 191 LoadNextTab();
187 } else { 192 } else {
188 // Start listening to network state notification now. 193 net::NetworkChangeNotifier::AddOnlineStateObserver(this);
189 registrar_.Add(this, chrome::NOTIFICATION_NETWORK_STATE_CHANGED,
190 NotificationService::AllSources());
191 } 194 }
192 #else 195 #else
193 loading_ = true; 196 loading_ = true;
194 LoadNextTab(); 197 LoadNextTab();
195 #endif 198 #endif
196 } 199 }
197 200
198 void TabLoader::LoadNextTab() { 201 void TabLoader::LoadNextTab() {
199 if (!tabs_to_load_.empty()) { 202 if (!tabs_to_load_.empty()) {
200 NavigationController* tab = tabs_to_load_.front(); 203 NavigationController* tab = tabs_to_load_.front();
(...skipping 24 matching lines...) Expand all
225 force_load_timer_.Start(FROM_HERE, 228 force_load_timer_.Start(FROM_HERE,
226 base::TimeDelta::FromMilliseconds(force_load_delay_), 229 base::TimeDelta::FromMilliseconds(force_load_delay_),
227 this, &TabLoader::ForceLoadTimerFired); 230 this, &TabLoader::ForceLoadTimerFired);
228 } 231 }
229 } 232 }
230 233
231 void TabLoader::Observe(int type, 234 void TabLoader::Observe(int type,
232 const NotificationSource& source, 235 const NotificationSource& source,
233 const NotificationDetails& details) { 236 const NotificationDetails& details) {
234 switch (type) { 237 switch (type) {
235 #if defined(OS_CHROMEOS)
236 case chrome::NOTIFICATION_NETWORK_STATE_CHANGED: {
237 chromeos::NetworkStateDetails* state_details =
238 Details<chromeos::NetworkStateDetails>(details).ptr();
239 switch (state_details->state()) {
240 case chromeos::NetworkStateDetails::CONNECTED:
241 if (!loading_) {
242 loading_ = true;
243 LoadNextTab();
244 }
245 // Start loading
246 break;
247 case chromeos::NetworkStateDetails::CONNECTING:
248 case chromeos::NetworkStateDetails::DISCONNECTED:
249 // Disconnected while loading. Set loading_ false so
250 // that it stops trying to load next tab.
251 loading_ = false;
252 break;
253 default:
254 NOTREACHED() << "Unknown nework state notification:"
255 << state_details->state();
256 }
257 break;
258 }
259 #endif
260 case content::NOTIFICATION_LOAD_START: { 238 case content::NOTIFICATION_LOAD_START: {
261 // Add this render_widget_host to the set of those we're waiting for 239 // Add this render_widget_host to the set of those we're waiting for
262 // paints on. We want to only record stats for paints that occur after 240 // paints on. We want to only record stats for paints that occur after
263 // a load has finished. 241 // a load has finished.
264 NavigationController* tab = Source<NavigationController>(source).ptr(); 242 NavigationController* tab = Source<NavigationController>(source).ptr();
265 RenderWidgetHost* render_widget_host = GetRenderWidgetHost(tab); 243 RenderWidgetHost* render_widget_host = GetRenderWidgetHost(tab);
266 DCHECK(render_widget_host); 244 DCHECK(render_widget_host);
267 render_widget_hosts_loading_.insert(render_widget_host); 245 render_widget_hosts_loading_.insert(render_widget_host);
268 break; 246 break;
269 } 247 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 } 303 }
326 default: 304 default:
327 NOTREACHED() << "Unknown notification received:" << type; 305 NOTREACHED() << "Unknown notification received:" << type;
328 } 306 }
329 // Delete ourselves when we're not waiting for any more notifications. 307 // Delete ourselves when we're not waiting for any more notifications.
330 if ((got_first_paint_ || render_widget_hosts_to_paint_.empty()) && 308 if ((got_first_paint_ || render_widget_hosts_to_paint_.empty()) &&
331 tabs_loading_.empty() && tabs_to_load_.empty()) 309 tabs_loading_.empty() && tabs_to_load_.empty())
332 delete this; 310 delete this;
333 } 311 }
334 312
313 void TabLoader::OnOnlineStateChanged(bool online) {
314 if (online) {
315 if (!loading_) {
316 loading_ = true;
317 LoadNextTab();
318 }
319 } else {
320 loading_ = false;
321 }
322 }
323
335 void TabLoader::RemoveTab(NavigationController* tab) { 324 void TabLoader::RemoveTab(NavigationController* tab) {
336 registrar_.Remove(this, content::NOTIFICATION_TAB_CONTENTS_DESTROYED, 325 registrar_.Remove(this, content::NOTIFICATION_TAB_CONTENTS_DESTROYED,
337 Source<TabContents>(tab->tab_contents())); 326 Source<TabContents>(tab->tab_contents()));
338 registrar_.Remove(this, content::NOTIFICATION_LOAD_STOP, 327 registrar_.Remove(this, content::NOTIFICATION_LOAD_STOP,
339 Source<NavigationController>(tab)); 328 Source<NavigationController>(tab));
340 registrar_.Remove(this, content::NOTIFICATION_LOAD_START, 329 registrar_.Remove(this, content::NOTIFICATION_LOAD_START,
341 Source<NavigationController>(tab)); 330 Source<NavigationController>(tab));
342 331
343 TabsLoading::iterator i = tabs_loading_.find(tab); 332 TabsLoading::iterator i = tabs_loading_.find(tab);
344 if (i != tabs_loading_.end()) 333 if (i != tabs_loading_.end())
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
869 std::vector<GURL> gurls; 858 std::vector<GURL> gurls;
870 SessionRestoreImpl restorer(profile, 859 SessionRestoreImpl restorer(profile,
871 static_cast<Browser*>(NULL), true, false, true, gurls); 860 static_cast<Browser*>(NULL), true, false, true, gurls);
872 restorer.RestoreForeignTab(tab); 861 restorer.RestoreForeignTab(tab);
873 } 862 }
874 863
875 // static 864 // static
876 bool SessionRestore::IsRestoring() { 865 bool SessionRestore::IsRestoring() {
877 return restoring; 866 return restoring;
878 } 867 }
OLDNEW
« no previous file with comments | « chrome/browser/renderer_host/offline_resource_handler.cc ('k') | chrome/browser/ui/browser_init.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698