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

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

Issue 8929007: Restore sessionStorage when chrome restarts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years 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_service.h" 5 #include "chrome/browser/sessions/session_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <set> 9 #include <set>
10 #include <vector> 10 #include <vector>
(...skipping 14 matching lines...) Expand all
25 #include "chrome/browser/sessions/session_command.h" 25 #include "chrome/browser/sessions/session_command.h"
26 #include "chrome/browser/sessions/session_restore.h" 26 #include "chrome/browser/sessions/session_restore.h"
27 #include "chrome/browser/sessions/session_types.h" 27 #include "chrome/browser/sessions/session_types.h"
28 #include "chrome/browser/tabs/tab_strip_model.h" 28 #include "chrome/browser/tabs/tab_strip_model.h"
29 #include "chrome/browser/ui/browser_init.h" 29 #include "chrome/browser/ui/browser_init.h"
30 #include "chrome/browser/ui/browser_list.h" 30 #include "chrome/browser/ui/browser_list.h"
31 #include "chrome/browser/ui/browser_window.h" 31 #include "chrome/browser/ui/browser_window.h"
32 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 32 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
33 #include "chrome/common/chrome_notification_types.h" 33 #include "chrome/common/chrome_notification_types.h"
34 #include "chrome/common/extensions/extension.h" 34 #include "chrome/common/extensions/extension.h"
35 #include "content/browser/in_process_webkit/dom_storage_namespace.h"
36 #include "content/browser/in_process_webkit/session_storage_namespace.h"
35 #include "content/browser/tab_contents/navigation_details.h" 37 #include "content/browser/tab_contents/navigation_details.h"
36 #include "content/browser/tab_contents/navigation_entry.h" 38 #include "content/browser/tab_contents/navigation_entry.h"
37 #include "content/browser/tab_contents/tab_contents.h" 39 #include "content/browser/tab_contents/tab_contents.h"
38 #include "content/public/browser/notification_service.h" 40 #include "content/public/browser/notification_service.h"
39 #include "content/public/browser/notification_details.h" 41 #include "content/public/browser/notification_details.h"
40 42
41 #if defined(OS_MACOSX) 43 #if defined(OS_MACOSX)
42 #include "chrome/browser/app_controller_cppsafe_mac.h" 44 #include "chrome/browser/app_controller_cppsafe_mac.h"
43 #endif 45 #endif
44 46
(...skipping 12 matching lines...) Expand all
57 static const SessionCommand::id_type kCommandSetSelectedNavigationIndex = 7; 59 static const SessionCommand::id_type kCommandSetSelectedNavigationIndex = 7;
58 static const SessionCommand::id_type kCommandSetSelectedTabInIndex = 8; 60 static const SessionCommand::id_type kCommandSetSelectedTabInIndex = 8;
59 static const SessionCommand::id_type kCommandSetWindowType = 9; 61 static const SessionCommand::id_type kCommandSetWindowType = 9;
60 // OBSOLETE Superseded by kCommandSetWindowBounds3. Except for data migration. 62 // OBSOLETE Superseded by kCommandSetWindowBounds3. Except for data migration.
61 // static const SessionCommand::id_type kCommandSetWindowBounds2 = 10; 63 // static const SessionCommand::id_type kCommandSetWindowBounds2 = 10;
62 static const SessionCommand::id_type 64 static const SessionCommand::id_type
63 kCommandTabNavigationPathPrunedFromFront = 11; 65 kCommandTabNavigationPathPrunedFromFront = 11;
64 static const SessionCommand::id_type kCommandSetPinnedState = 12; 66 static const SessionCommand::id_type kCommandSetPinnedState = 12;
65 static const SessionCommand::id_type kCommandSetExtensionAppID = 13; 67 static const SessionCommand::id_type kCommandSetExtensionAppID = 13;
66 static const SessionCommand::id_type kCommandSetWindowBounds3 = 14; 68 static const SessionCommand::id_type kCommandSetWindowBounds3 = 14;
69 static const SessionCommand::id_type kCommandSessionStorageCreated = 15;
67 70
68 // Every kWritesPerReset commands triggers recreating the file. 71 // Every kWritesPerReset commands triggers recreating the file.
69 static const int kWritesPerReset = 250; 72 static const int kWritesPerReset = 250;
70 73
71 namespace { 74 namespace {
72 75
73 // The callback from GetLastSession is internally routed to SessionService 76 // The callback from GetLastSession is internally routed to SessionService
74 // first and then the caller. This is done so that the SessionWindows can be 77 // first and then the caller. This is done so that the SessionWindows can be
75 // recreated from the SessionCommands and the SessionWindows passed to the 78 // recreated from the SessionCommands and the SessionWindows passed to the
76 // caller. The following class is used for this. 79 // caller. The following class is used for this.
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 content::NotificationService::AllSources()); 451 content::NotificationService::AllSources());
449 registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_CHANGED, 452 registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_CHANGED,
450 content::NotificationService::AllSources()); 453 content::NotificationService::AllSources());
451 registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, 454 registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED,
452 content::NotificationService::AllSources()); 455 content::NotificationService::AllSources());
453 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_OPENED, 456 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_OPENED,
454 content::NotificationService::AllBrowserContextsAndSources()); 457 content::NotificationService::AllBrowserContextsAndSources());
455 registrar_.Add( 458 registrar_.Add(
456 this, chrome::NOTIFICATION_TAB_CONTENTS_APPLICATION_EXTENSION_CHANGED, 459 this, chrome::NOTIFICATION_TAB_CONTENTS_APPLICATION_EXTENSION_CHANGED,
457 content::NotificationService::AllSources()); 460 content::NotificationService::AllSources());
461 registrar_.Add(this, content::NOTIFICATION_DOM_STORAGE_NAMESPACE_CREATED,
462 content::NotificationService::AllSources());
458 } 463 }
459 464
460 bool SessionService::ShouldNewWindowStartSession() { 465 bool SessionService::ShouldNewWindowStartSession() {
461 if (!has_open_trackable_browsers_ && !BrowserInit::InProcessStartup() && 466 if (!has_open_trackable_browsers_ && !BrowserInit::InProcessStartup() &&
462 !SessionRestore::IsRestoring() 467 !SessionRestore::IsRestoring()
463 #if defined(OS_MACOSX) 468 #if defined(OS_MACOSX)
464 // OSX has a fairly different idea of application lifetime than the 469 // OSX has a fairly different idea of application lifetime than the
465 // other platforms. We need to check that we aren't opening a window 470 // other platforms. We need to check that we aren't opening a window
466 // from the dock or the menubar. 471 // from the dock or the menubar.
467 && !app_controller_mac::IsOpeningNewWindow() 472 && !app_controller_mac::IsOpeningNewWindow()
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 RestoreIfNecessary(std::vector<GURL>(), browser); 515 RestoreIfNecessary(std::vector<GURL>(), browser);
511 SetWindowType(browser->session_id(), browser->type()); 516 SetWindowType(browser->session_id(), browser->type());
512 break; 517 break;
513 } 518 }
514 519
515 case content::NOTIFICATION_TAB_PARENTED: { 520 case content::NOTIFICATION_TAB_PARENTED: {
516 TabContentsWrapper* tab = 521 TabContentsWrapper* tab =
517 content::Source<TabContentsWrapper>(source).ptr(); 522 content::Source<TabContentsWrapper>(source).ptr();
518 if (tab->profile() != profile()) 523 if (tab->profile() != profile())
519 return; 524 return;
525
526 // Record the association between the sessionStorage namespace and the
527 // tab.
528 SessionStorageNamespace* session_storage_namespace =
529 tab->tab_contents()->controller().session_storage_namespace();
530 session_storage_namespace_map_[session_storage_namespace->id()] =
531 std::make_pair(tab->restore_tab_helper()->window_id(),
532 tab->restore_tab_helper()->session_id());
533
520 SetTabWindow(tab->restore_tab_helper()->window_id(), 534 SetTabWindow(tab->restore_tab_helper()->window_id(),
521 tab->restore_tab_helper()->session_id()); 535 tab->restore_tab_helper()->session_id());
522 if (tab->extension_tab_helper()->extension_app()) { 536 if (tab->extension_tab_helper()->extension_app()) {
523 SetTabExtensionAppID( 537 SetTabExtensionAppID(
524 tab->restore_tab_helper()->window_id(), 538 tab->restore_tab_helper()->window_id(),
525 tab->restore_tab_helper()->session_id(), 539 tab->restore_tab_helper()->session_id(),
526 tab->extension_tab_helper()->extension_app()->id()); 540 tab->extension_tab_helper()->extension_app()->id());
527 } 541 }
528 break; 542 break;
529 } 543 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
618 if (extension_tab_helper->extension_app()) { 632 if (extension_tab_helper->extension_app()) {
619 RestoreTabHelper* helper = 633 RestoreTabHelper* helper =
620 extension_tab_helper->tab_contents_wrapper()->restore_tab_helper(); 634 extension_tab_helper->tab_contents_wrapper()->restore_tab_helper();
621 SetTabExtensionAppID(helper->window_id(), 635 SetTabExtensionAppID(helper->window_id(),
622 helper->session_id(), 636 helper->session_id(),
623 extension_tab_helper->extension_app()->id()); 637 extension_tab_helper->extension_app()->id());
624 } 638 }
625 break; 639 break;
626 } 640 }
627 641
642 case content::NOTIFICATION_DOM_STORAGE_NAMESPACE_CREATED: {
643 content::Details<DOMStorageNamespaceCreatedDetails>
644 namespace_created_details(details);
645
646 SessionStorageNamespaceMap::const_iterator it =
647 session_storage_namespace_map_.find(namespace_created_details->id);
648 if (it != session_storage_namespace_map_.end()) {
649 Pickle session_storage_created_pickle;
650 session_storage_created_pickle.WriteInt(it->second.first.id());
651 session_storage_created_pickle.WriteInt(it->second.second.id());
652 session_storage_created_pickle.WriteString(
653 namespace_created_details->session_storage_directory.value());
654 ScheduleCommand(new SessionCommand(kCommandSessionStorageCreated,
michaeln 2011/12/13 20:40:03 I'm not at all familiar with this SessionService c
marja 2012/01/11 15:17:53 ScheduleCommand puts the command into a queue and
655 session_storage_created_pickle));
656 }
657 break;
658 }
659
628 default: 660 default:
629 NOTREACHED(); 661 NOTREACHED();
630 } 662 }
631 } 663 }
632 664
633 void SessionService::SetTabExtensionAppID( 665 void SessionService::SetTabExtensionAppID(
634 const SessionID& window_id, 666 const SessionID& window_id,
635 const SessionID& tab_id, 667 const SessionID& tab_id,
636 const std::string& extension_app_id) { 668 const std::string& extension_app_id) {
637 if (!ShouldTrackChangesToWindow(window_id)) 669 if (!ShouldTrackChangesToWindow(window_id))
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after
1088 SessionID::id_type tab_id; 1120 SessionID::id_type tab_id;
1089 std::string extension_app_id; 1121 std::string extension_app_id;
1090 if (!RestoreSetTabExtensionAppIDCommand( 1122 if (!RestoreSetTabExtensionAppIDCommand(
1091 *command, &tab_id, &extension_app_id)) { 1123 *command, &tab_id, &extension_app_id)) {
1092 return true; 1124 return true;
1093 } 1125 }
1094 1126
1095 GetTab(tab_id, tabs)->extension_app_id.swap(extension_app_id); 1127 GetTab(tab_id, tabs)->extension_app_id.swap(extension_app_id);
1096 break; 1128 break;
1097 } 1129 }
1130 case kCommandSessionStorageCreated: {
1131 scoped_ptr<Pickle> pickle(command->PayloadAsPickle());
1132 SessionID::id_type window_id;
1133 SessionID::id_type tab_id;
1134 std::string session_storage_directory;
1135 void* iter = NULL;
1136 pickle->ReadInt(&iter, &window_id);
1137 pickle->ReadInt(&iter, &tab_id);
1138 pickle->ReadString(&iter, &session_storage_directory);
1139 GetTab(tab_id, tabs)->session_storage_directory =
1140 FilePath(session_storage_directory);
1141 break;
1142 }
1098 1143
1099 default: 1144 default:
1100 return true; 1145 return true;
1101 } 1146 }
1102 } 1147 }
1103 return true; 1148 return true;
1104 } 1149 }
1105 1150
1106 void SessionService::BuildCommandsForTab( 1151 void SessionService::BuildCommandsForTab(
1107 const SessionID& window_id, 1152 const SessionID& window_id,
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
1510 50); 1555 50);
1511 if (use_long_period) { 1556 if (use_long_period) {
1512 std::string long_name_("SessionRestore.SaveLongPeriod"); 1557 std::string long_name_("SessionRestore.SaveLongPeriod");
1513 UMA_HISTOGRAM_CUSTOM_TIMES(long_name_, 1558 UMA_HISTOGRAM_CUSTOM_TIMES(long_name_,
1514 delta, 1559 delta,
1515 save_delay_in_mins_, 1560 save_delay_in_mins_,
1516 save_delay_in_hrs_, 1561 save_delay_in_hrs_,
1517 50); 1562 50);
1518 } 1563 }
1519 } 1564 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698