OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/scoped_ptr.h" | 10 #include "base/scoped_ptr.h" |
| 11 #include "base/stl_util-inl.h" |
11 #include "base/string_util.h" | 12 #include "base/string_util.h" |
12 #include "chrome/browser/browser.h" | 13 #include "chrome/browser/browser.h" |
13 #include "chrome/browser/browser_list.h" | 14 #include "chrome/browser/browser_list.h" |
14 #include "chrome/browser/browser_process.h" | 15 #include "chrome/browser/browser_process.h" |
15 #include "chrome/browser/browser_window.h" | 16 #include "chrome/browser/browser_window.h" |
16 #include "chrome/browser/profile.h" | 17 #include "chrome/browser/profile.h" |
17 #include "chrome/browser/sessions/session_service.h" | 18 #include "chrome/browser/sessions/session_service.h" |
18 #include "chrome/browser/sessions/session_types.h" | 19 #include "chrome/browser/sessions/session_types.h" |
19 #include "chrome/browser/tab_contents/navigation_controller.h" | 20 #include "chrome/browser/tab_contents/navigation_controller.h" |
20 #include "chrome/browser/tab_contents/tab_contents.h" | 21 #include "chrome/browser/tab_contents/tab_contents.h" |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 | 185 |
185 void Restore() { | 186 void Restore() { |
186 SessionService* session_service = profile_->GetSessionService(); | 187 SessionService* session_service = profile_->GetSessionService(); |
187 DCHECK(session_service); | 188 DCHECK(session_service); |
188 SessionService::LastSessionCallback* callback = | 189 SessionService::LastSessionCallback* callback = |
189 NewCallback(this, &SessionRestoreImpl::OnGotSession); | 190 NewCallback(this, &SessionRestoreImpl::OnGotSession); |
190 session_service->GetLastSession(&request_consumer_, callback); | 191 session_service->GetLastSession(&request_consumer_, callback); |
191 | 192 |
192 if (synchronous_) { | 193 if (synchronous_) { |
193 MessageLoop::current()->Run(); | 194 MessageLoop::current()->Run(); |
| 195 ProcessSessionWindows(&windows_); |
194 delete this; | 196 delete this; |
195 return; | 197 return; |
196 } | 198 } |
197 | 199 |
198 if (browser_) { | 200 if (browser_) { |
199 registrar_.Add(this, NotificationType::BROWSER_CLOSED, | 201 registrar_.Add(this, NotificationType::BROWSER_CLOSED, |
200 Source<Browser>(browser_)); | 202 Source<Browser>(browser_)); |
201 } | 203 } |
202 } | 204 } |
203 | 205 |
204 ~SessionRestoreImpl() { | 206 ~SessionRestoreImpl() { |
| 207 STLDeleteElements(&windows_); |
205 } | 208 } |
206 | 209 |
207 virtual void Observe(NotificationType type, | 210 virtual void Observe(NotificationType type, |
208 const NotificationSource& source, | 211 const NotificationSource& source, |
209 const NotificationDetails& details) { | 212 const NotificationDetails& details) { |
210 if (type != NotificationType::BROWSER_CLOSED) { | 213 if (type != NotificationType::BROWSER_CLOSED) { |
211 NOTREACHED(); | 214 NOTREACHED(); |
212 return; | 215 return; |
213 } | 216 } |
214 delete this; | 217 delete this; |
(...skipping 16 matching lines...) Expand all Loading... |
231 if (urls_to_open_.empty()) { | 234 if (urls_to_open_.empty()) { |
232 // No tab browsers were created and no URLs were supplied on the command | 235 // No tab browsers were created and no URLs were supplied on the command |
233 // line. Add an empty URL, which is treated as opening the users home | 236 // line. Add an empty URL, which is treated as opening the users home |
234 // page. | 237 // page. |
235 urls_to_open_.push_back(GURL()); | 238 urls_to_open_.push_back(GURL()); |
236 } | 239 } |
237 AppendURLsToBrowser(browser, urls_to_open_, honor_pin_tabs); | 240 AppendURLsToBrowser(browser, urls_to_open_, honor_pin_tabs); |
238 browser->window()->Show(); | 241 browser->window()->Show(); |
239 } | 242 } |
240 | 243 |
241 if (synchronous_) | |
242 MessageLoop::current()->Quit(); | |
243 | |
244 if (succeeded) { | 244 if (succeeded) { |
245 DCHECK(tab_loader_.get()); | 245 DCHECK(tab_loader_.get()); |
246 // TabLoader delets itself when done loading. | 246 // TabLoader delets itself when done loading. |
247 tab_loader_.release()->LoadTabs(); | 247 tab_loader_.release()->LoadTabs(); |
248 } | 248 } |
249 | 249 |
250 if (!synchronous_) { | 250 if (!synchronous_) { |
251 // If we're not synchronous we need to delete ourself. | 251 // If we're not synchronous we need to delete ourself. |
252 // NOTE: we must use DeleteLater here as most likely we're in a callback | 252 // NOTE: we must use DeleteLater here as most likely we're in a callback |
253 // from the history service which doesn't deal well with deleting the | 253 // from the history service which doesn't deal well with deleting the |
254 // object it is notifying. | 254 // object it is notifying. |
255 MessageLoop::current()->DeleteSoon(FROM_HERE, this); | 255 MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
256 } | 256 } |
257 } | 257 } |
258 | 258 |
259 void OnGotSession(SessionService::Handle handle, | 259 void OnGotSession(SessionService::Handle handle, |
260 std::vector<SessionWindow*>* windows) { | 260 std::vector<SessionWindow*>* windows) { |
| 261 if (synchronous_) { |
| 262 // See comment above windows_ as to why we don't process immediately. |
| 263 windows_.swap(*windows); |
| 264 MessageLoop::current()->Quit(); |
| 265 return; |
| 266 } |
| 267 ProcessSessionWindows(windows); |
| 268 } |
| 269 |
| 270 void ProcessSessionWindows(std::vector<SessionWindow*>* windows) { |
261 if (windows->empty()) { | 271 if (windows->empty()) { |
262 // Restore was unsuccessful. | 272 // Restore was unsuccessful. |
263 FinishedTabCreation(false, false); | 273 FinishedTabCreation(false, false); |
264 return; | 274 return; |
265 } | 275 } |
266 | 276 |
267 tab_loader_.reset(new TabLoader()); | 277 tab_loader_.reset(new TabLoader()); |
268 | 278 |
269 Browser* current_browser = | 279 Browser* current_browser = |
270 browser_ ? browser_ : BrowserList::GetLastActive(); | 280 browser_ ? browser_ : BrowserList::GetLastActive(); |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 | 420 |
411 // Set of URLs to open in addition to those restored from the session. | 421 // Set of URLs to open in addition to those restored from the session. |
412 std::vector<GURL> urls_to_open_; | 422 std::vector<GURL> urls_to_open_; |
413 | 423 |
414 // Used to get the session. | 424 // Used to get the session. |
415 CancelableRequestConsumer request_consumer_; | 425 CancelableRequestConsumer request_consumer_; |
416 | 426 |
417 // Responsible for loading the tabs. | 427 // Responsible for loading the tabs. |
418 scoped_ptr<TabLoader> tab_loader_; | 428 scoped_ptr<TabLoader> tab_loader_; |
419 | 429 |
| 430 // When synchronous we run a nested message loop. To avoid creating windows |
| 431 // from the nested message loop (which can make exiting the nested message |
| 432 // loop take a while) we cache the SessionWindows here and create the actual |
| 433 // windows when the nested message loop exits. |
| 434 std::vector<SessionWindow*> windows_; |
| 435 |
420 NotificationRegistrar registrar_; | 436 NotificationRegistrar registrar_; |
421 }; | 437 }; |
422 | 438 |
423 } // namespace | 439 } // namespace |
424 | 440 |
425 // SessionRestore ------------------------------------------------------------- | 441 // SessionRestore ------------------------------------------------------------- |
426 | 442 |
427 // static | 443 // static |
428 size_t SessionRestore::num_tabs_to_load_ = 0; | 444 size_t SessionRestore::num_tabs_to_load_ = 0; |
429 | 445 |
(...skipping 29 matching lines...) Expand all Loading... |
459 Restore(profile, browser, false, clobber_existing_window, | 475 Restore(profile, browser, false, clobber_existing_window, |
460 always_create_tabbed_browser, urls_to_open); | 476 always_create_tabbed_browser, urls_to_open); |
461 } | 477 } |
462 | 478 |
463 // static | 479 // static |
464 void SessionRestore::RestoreSessionSynchronously( | 480 void SessionRestore::RestoreSessionSynchronously( |
465 Profile* profile, | 481 Profile* profile, |
466 const std::vector<GURL>& urls_to_open) { | 482 const std::vector<GURL>& urls_to_open) { |
467 Restore(profile, NULL, true, false, true, urls_to_open); | 483 Restore(profile, NULL, true, false, true, urls_to_open); |
468 } | 484 } |
OLD | NEW |