| OLD | NEW |
| 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_types.h" | 5 #include "chrome/browser/sessions/session_types.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/pickle.h" | |
| 9 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 10 #include "base/string_util.h" | |
| 11 #include "base/utf_string_conversions.h" | |
| 12 #include "chrome/browser/search/search.h" | |
| 13 #include "chrome/browser/sessions/session_command.h" | 9 #include "chrome/browser/sessions/session_command.h" |
| 14 #include "chrome/browser/ui/browser.h" | 10 #include "chrome/browser/ui/browser.h" |
| 15 #include "content/public/browser/favicon_status.h" | |
| 16 #include "content/public/browser/navigation_controller.h" | |
| 17 #include "content/public/browser/navigation_entry.h" | |
| 18 #include "sync/util/time.h" | |
| 19 #include "third_party/WebKit/Source/Platform/chromium/public/WebReferrerPolicy.h
" | |
| 20 #include "webkit/glue/glue_serialize.h" | |
| 21 | 11 |
| 22 using content::NavigationEntry; | 12 using components::SerializedNavigationEntry; |
| 23 | |
| 24 // TabNavigation -------------------------------------------------------------- | |
| 25 | |
| 26 TabNavigation::TabNavigation() | |
| 27 : index_(-1), | |
| 28 unique_id_(0), | |
| 29 transition_type_(content::PAGE_TRANSITION_TYPED), | |
| 30 has_post_data_(false), | |
| 31 post_id_(-1), | |
| 32 is_overriding_user_agent_(false) {} | |
| 33 | |
| 34 TabNavigation::~TabNavigation() {} | |
| 35 | |
| 36 // static | |
| 37 TabNavigation TabNavigation::FromNavigationEntry( | |
| 38 int index, | |
| 39 const NavigationEntry& entry) { | |
| 40 TabNavigation navigation; | |
| 41 navigation.index_ = index; | |
| 42 navigation.unique_id_ = entry.GetUniqueID(); | |
| 43 navigation.referrer_ = entry.GetReferrer(); | |
| 44 navigation.virtual_url_ = entry.GetVirtualURL(); | |
| 45 navigation.title_ = entry.GetTitle(); | |
| 46 navigation.content_state_ = entry.GetContentState(); | |
| 47 navigation.transition_type_ = entry.GetTransitionType(); | |
| 48 navigation.has_post_data_ = entry.GetHasPostData(); | |
| 49 navigation.post_id_ = entry.GetPostID(); | |
| 50 navigation.original_request_url_ = entry.GetOriginalRequestURL(); | |
| 51 navigation.is_overriding_user_agent_ = entry.GetIsOverridingUserAgent(); | |
| 52 navigation.timestamp_ = entry.GetTimestamp(); | |
| 53 // If you want to navigate a named frame in Chrome, you will first need to | |
| 54 // add support for persisting it. It is currently only used for layout tests. | |
| 55 CHECK(entry.GetFrameToNavigate().empty()); | |
| 56 navigation.search_terms_ = | |
| 57 chrome::GetSearchTermsFromNavigationEntry(&entry); | |
| 58 if (entry.GetFavicon().valid) | |
| 59 navigation.favicon_url_ = entry.GetFavicon().url; | |
| 60 | |
| 61 return navigation; | |
| 62 } | |
| 63 | |
| 64 TabNavigation TabNavigation::FromSyncData( | |
| 65 int index, | |
| 66 const sync_pb::TabNavigation& sync_data) { | |
| 67 TabNavigation navigation; | |
| 68 navigation.index_ = index; | |
| 69 navigation.unique_id_ = sync_data.unique_id(); | |
| 70 navigation.referrer_ = | |
| 71 content::Referrer(GURL(sync_data.referrer()), | |
| 72 WebKit::WebReferrerPolicyDefault); | |
| 73 navigation.virtual_url_ = GURL(sync_data.virtual_url()); | |
| 74 navigation.title_ = UTF8ToUTF16(sync_data.title()); | |
| 75 navigation.content_state_ = sync_data.state(); | |
| 76 | |
| 77 uint32 transition = 0; | |
| 78 if (sync_data.has_page_transition()) { | |
| 79 switch (sync_data.page_transition()) { | |
| 80 case sync_pb::SyncEnums_PageTransition_LINK: | |
| 81 transition = content::PAGE_TRANSITION_LINK; | |
| 82 break; | |
| 83 case sync_pb::SyncEnums_PageTransition_TYPED: | |
| 84 transition = content::PAGE_TRANSITION_TYPED; | |
| 85 break; | |
| 86 case sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK: | |
| 87 transition = content::PAGE_TRANSITION_AUTO_BOOKMARK; | |
| 88 break; | |
| 89 case sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME: | |
| 90 transition = content::PAGE_TRANSITION_AUTO_SUBFRAME; | |
| 91 break; | |
| 92 case sync_pb::SyncEnums_PageTransition_MANUAL_SUBFRAME: | |
| 93 transition = content::PAGE_TRANSITION_MANUAL_SUBFRAME; | |
| 94 break; | |
| 95 case sync_pb::SyncEnums_PageTransition_GENERATED: | |
| 96 transition = content::PAGE_TRANSITION_GENERATED; | |
| 97 break; | |
| 98 case sync_pb::SyncEnums_PageTransition_AUTO_TOPLEVEL: | |
| 99 transition = content::PAGE_TRANSITION_AUTO_TOPLEVEL; | |
| 100 break; | |
| 101 case sync_pb::SyncEnums_PageTransition_FORM_SUBMIT: | |
| 102 transition = content::PAGE_TRANSITION_FORM_SUBMIT; | |
| 103 break; | |
| 104 case sync_pb::SyncEnums_PageTransition_RELOAD: | |
| 105 transition = content::PAGE_TRANSITION_RELOAD; | |
| 106 break; | |
| 107 case sync_pb::SyncEnums_PageTransition_KEYWORD: | |
| 108 transition = content::PAGE_TRANSITION_KEYWORD; | |
| 109 break; | |
| 110 case sync_pb::SyncEnums_PageTransition_KEYWORD_GENERATED: | |
| 111 transition = | |
| 112 content::PAGE_TRANSITION_KEYWORD_GENERATED; | |
| 113 break; | |
| 114 default: | |
| 115 transition = content::PAGE_TRANSITION_LINK; | |
| 116 break; | |
| 117 } | |
| 118 } | |
| 119 | |
| 120 if (sync_data.has_redirect_type()) { | |
| 121 switch (sync_data.redirect_type()) { | |
| 122 case sync_pb::SyncEnums_PageTransitionRedirectType_CLIENT_REDIRECT: | |
| 123 transition |= content::PAGE_TRANSITION_CLIENT_REDIRECT; | |
| 124 break; | |
| 125 case sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT: | |
| 126 transition |= content::PAGE_TRANSITION_SERVER_REDIRECT; | |
| 127 break; | |
| 128 } | |
| 129 } | |
| 130 if (sync_data.navigation_forward_back()) | |
| 131 transition |= content::PAGE_TRANSITION_FORWARD_BACK; | |
| 132 if (sync_data.navigation_from_address_bar()) | |
| 133 transition |= content::PAGE_TRANSITION_FROM_ADDRESS_BAR; | |
| 134 if (sync_data.navigation_home_page()) | |
| 135 transition |= content::PAGE_TRANSITION_HOME_PAGE; | |
| 136 if (sync_data.navigation_chain_start()) | |
| 137 transition |= content::PAGE_TRANSITION_CHAIN_START; | |
| 138 if (sync_data.navigation_chain_end()) | |
| 139 transition |= content::PAGE_TRANSITION_CHAIN_END; | |
| 140 | |
| 141 navigation.transition_type_ = | |
| 142 static_cast<content::PageTransition>(transition); | |
| 143 | |
| 144 navigation.timestamp_ = base::Time(); | |
| 145 navigation.search_terms_ = UTF8ToUTF16(sync_data.search_terms()); | |
| 146 if (sync_data.has_favicon_url()) | |
| 147 navigation.favicon_url_ = GURL(sync_data.favicon_url()); | |
| 148 | |
| 149 return navigation; | |
| 150 } | |
| 151 | |
| 152 namespace { | |
| 153 | |
| 154 // Helper used by TabNavigation::WriteToPickle(). It writes |str| to | |
| 155 // |pickle|, if and only if |str| fits within (|max_bytes| - | |
| 156 // |*bytes_written|). |bytes_written| is incremented to reflect the | |
| 157 // data written. | |
| 158 // | |
| 159 // TODO(akalin): Unify this with the same function in | |
| 160 // base_session_service.cc. | |
| 161 void WriteStringToPickle(Pickle* pickle, | |
| 162 int* bytes_written, | |
| 163 int max_bytes, | |
| 164 const std::string& str) { | |
| 165 int num_bytes = str.size() * sizeof(char); | |
| 166 if (*bytes_written + num_bytes < max_bytes) { | |
| 167 *bytes_written += num_bytes; | |
| 168 pickle->WriteString(str); | |
| 169 } else { | |
| 170 pickle->WriteString(std::string()); | |
| 171 } | |
| 172 } | |
| 173 | |
| 174 // string16 version of WriteStringToPickle. | |
| 175 // | |
| 176 // TODO(akalin): Unify this, too. | |
| 177 void WriteString16ToPickle(Pickle* pickle, | |
| 178 int* bytes_written, | |
| 179 int max_bytes, | |
| 180 const string16& str) { | |
| 181 int num_bytes = str.size() * sizeof(char16); | |
| 182 if (*bytes_written + num_bytes < max_bytes) { | |
| 183 *bytes_written += num_bytes; | |
| 184 pickle->WriteString16(str); | |
| 185 } else { | |
| 186 pickle->WriteString16(string16()); | |
| 187 } | |
| 188 } | |
| 189 | |
| 190 // A mask used for arbitrary boolean values needed to represent a | |
| 191 // NavigationEntry. Currently only contains HAS_POST_DATA. | |
| 192 // | |
| 193 // NOTE(akalin): We may want to just serialize |has_post_data_| | |
| 194 // directly. Other bools (|is_overriding_user_agent_|) haven't been | |
| 195 // added to this mask. | |
| 196 enum TypeMask { | |
| 197 HAS_POST_DATA = 1 | |
| 198 }; | |
| 199 | |
| 200 } // namespace | |
| 201 | |
| 202 // Pickle order: | |
| 203 // | |
| 204 // index_ | |
| 205 // virtual_url_ | |
| 206 // title_ | |
| 207 // content_state_ | |
| 208 // transition_type_ | |
| 209 // | |
| 210 // Added on later: | |
| 211 // | |
| 212 // type_mask (has_post_data_) | |
| 213 // referrer_ | |
| 214 // original_request_url_ | |
| 215 // is_overriding_user_agent_ | |
| 216 // timestamp_ | |
| 217 // search_terms_ | |
| 218 | |
| 219 void TabNavigation::WriteToPickle(Pickle* pickle) const { | |
| 220 pickle->WriteInt(index_); | |
| 221 | |
| 222 // We only allow navigations up to 63k (which should be completely | |
| 223 // reasonable). On the off chance we get one that is too big, try to | |
| 224 // keep the url. | |
| 225 | |
| 226 // Bound the string data (which is variable length) to | |
| 227 // |max_state_size bytes| bytes. | |
| 228 static const size_t max_state_size = | |
| 229 std::numeric_limits<SessionCommand::size_type>::max() - 1024; | |
| 230 int bytes_written = 0; | |
| 231 | |
| 232 WriteStringToPickle(pickle, &bytes_written, max_state_size, | |
| 233 virtual_url_.spec()); | |
| 234 | |
| 235 WriteString16ToPickle(pickle, &bytes_written, max_state_size, title_); | |
| 236 | |
| 237 std::string content_state = content_state_; | |
| 238 if (has_post_data_) { | |
| 239 content_state = | |
| 240 webkit_glue::RemovePasswordDataFromHistoryState(content_state); | |
| 241 } | |
| 242 WriteStringToPickle(pickle, &bytes_written, max_state_size, content_state); | |
| 243 | |
| 244 pickle->WriteInt(transition_type_); | |
| 245 | |
| 246 const int type_mask = has_post_data_ ? HAS_POST_DATA : 0; | |
| 247 pickle->WriteInt(type_mask); | |
| 248 | |
| 249 WriteStringToPickle( | |
| 250 pickle, &bytes_written, max_state_size, | |
| 251 referrer_.url.is_valid() ? referrer_.url.spec() : std::string()); | |
| 252 | |
| 253 pickle->WriteInt(referrer_.policy); | |
| 254 | |
| 255 // Save info required to override the user agent. | |
| 256 WriteStringToPickle( | |
| 257 pickle, &bytes_written, max_state_size, | |
| 258 original_request_url_.is_valid() ? | |
| 259 original_request_url_.spec() : std::string()); | |
| 260 pickle->WriteBool(is_overriding_user_agent_); | |
| 261 pickle->WriteInt64(timestamp_.ToInternalValue()); | |
| 262 | |
| 263 WriteString16ToPickle(pickle, &bytes_written, max_state_size, search_terms_); | |
| 264 } | |
| 265 | |
| 266 bool TabNavigation::ReadFromPickle(PickleIterator* iterator) { | |
| 267 *this = TabNavigation(); | |
| 268 std::string virtual_url_spec; | |
| 269 int transition_type_int = 0; | |
| 270 if (!iterator->ReadInt(&index_) || | |
| 271 !iterator->ReadString(&virtual_url_spec) || | |
| 272 !iterator->ReadString16(&title_) || | |
| 273 !iterator->ReadString(&content_state_) || | |
| 274 !iterator->ReadInt(&transition_type_int)) | |
| 275 return false; | |
| 276 virtual_url_ = GURL(virtual_url_spec); | |
| 277 transition_type_ = static_cast<content::PageTransition>(transition_type_int); | |
| 278 | |
| 279 // type_mask did not always exist in the written stream. As such, we | |
| 280 // don't fail if it can't be read. | |
| 281 int type_mask = 0; | |
| 282 bool has_type_mask = iterator->ReadInt(&type_mask); | |
| 283 | |
| 284 if (has_type_mask) { | |
| 285 has_post_data_ = type_mask & HAS_POST_DATA; | |
| 286 // the "referrer" property was added after type_mask to the written | |
| 287 // stream. As such, we don't fail if it can't be read. | |
| 288 std::string referrer_spec; | |
| 289 if (!iterator->ReadString(&referrer_spec)) | |
| 290 referrer_spec = std::string(); | |
| 291 // The "referrer policy" property was added even later, so we fall back to | |
| 292 // the default policy if the property is not present. | |
| 293 int policy_int; | |
| 294 WebKit::WebReferrerPolicy policy; | |
| 295 if (iterator->ReadInt(&policy_int)) | |
| 296 policy = static_cast<WebKit::WebReferrerPolicy>(policy_int); | |
| 297 else | |
| 298 policy = WebKit::WebReferrerPolicyDefault; | |
| 299 referrer_ = content::Referrer(GURL(referrer_spec), policy); | |
| 300 | |
| 301 // If the original URL can't be found, leave it empty. | |
| 302 std::string original_request_url_spec; | |
| 303 if (!iterator->ReadString(&original_request_url_spec)) | |
| 304 original_request_url_spec = std::string(); | |
| 305 original_request_url_ = GURL(original_request_url_spec); | |
| 306 | |
| 307 // Default to not overriding the user agent if we don't have info. | |
| 308 if (!iterator->ReadBool(&is_overriding_user_agent_)) | |
| 309 is_overriding_user_agent_ = false; | |
| 310 | |
| 311 int64 timestamp_internal_value = 0; | |
| 312 if (iterator->ReadInt64(×tamp_internal_value)) { | |
| 313 timestamp_ = base::Time::FromInternalValue(timestamp_internal_value); | |
| 314 } else { | |
| 315 timestamp_ = base::Time(); | |
| 316 } | |
| 317 | |
| 318 // If the search terms field can't be found, leave it empty. | |
| 319 if (!iterator->ReadString16(&search_terms_)) | |
| 320 search_terms_.clear(); | |
| 321 } | |
| 322 | |
| 323 return true; | |
| 324 } | |
| 325 | |
| 326 scoped_ptr<NavigationEntry> TabNavigation::ToNavigationEntry( | |
| 327 int page_id, | |
| 328 content::BrowserContext* browser_context) const { | |
| 329 scoped_ptr<NavigationEntry> entry( | |
| 330 content::NavigationController::CreateNavigationEntry( | |
| 331 virtual_url_, | |
| 332 referrer_, | |
| 333 // Use a transition type of reload so that we don't incorrectly | |
| 334 // increase the typed count. | |
| 335 content::PAGE_TRANSITION_RELOAD, | |
| 336 false, | |
| 337 // The extra headers are not sync'ed across sessions. | |
| 338 std::string(), | |
| 339 browser_context)); | |
| 340 | |
| 341 entry->SetTitle(title_); | |
| 342 entry->SetContentState(content_state_); | |
| 343 entry->SetPageID(page_id); | |
| 344 entry->SetHasPostData(has_post_data_); | |
| 345 entry->SetPostID(post_id_); | |
| 346 entry->SetOriginalRequestURL(original_request_url_); | |
| 347 entry->SetIsOverridingUserAgent(is_overriding_user_agent_); | |
| 348 entry->SetTimestamp(timestamp_); | |
| 349 entry->SetExtraData(chrome::kInstantExtendedSearchTermsKey, search_terms_); | |
| 350 | |
| 351 return entry.Pass(); | |
| 352 } | |
| 353 | |
| 354 // TODO(zea): perhaps sync state (scroll position, form entries, etc.) as well? | |
| 355 // See http://crbug.com/67068. | |
| 356 sync_pb::TabNavigation TabNavigation::ToSyncData() const { | |
| 357 sync_pb::TabNavigation sync_data; | |
| 358 sync_data.set_virtual_url(virtual_url_.spec()); | |
| 359 // FIXME(zea): Support referrer policy? | |
| 360 sync_data.set_referrer(referrer_.url.spec()); | |
| 361 sync_data.set_title(UTF16ToUTF8(title_)); | |
| 362 | |
| 363 // Page transition core. | |
| 364 COMPILE_ASSERT(content::PAGE_TRANSITION_LAST_CORE == | |
| 365 content::PAGE_TRANSITION_KEYWORD_GENERATED, | |
| 366 PageTransitionCoreBounds); | |
| 367 switch (PageTransitionStripQualifier(transition_type_)) { | |
| 368 case content::PAGE_TRANSITION_LINK: | |
| 369 sync_data.set_page_transition( | |
| 370 sync_pb::SyncEnums_PageTransition_LINK); | |
| 371 break; | |
| 372 case content::PAGE_TRANSITION_TYPED: | |
| 373 sync_data.set_page_transition( | |
| 374 sync_pb::SyncEnums_PageTransition_TYPED); | |
| 375 break; | |
| 376 case content::PAGE_TRANSITION_AUTO_BOOKMARK: | |
| 377 sync_data.set_page_transition( | |
| 378 sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK); | |
| 379 break; | |
| 380 case content::PAGE_TRANSITION_AUTO_SUBFRAME: | |
| 381 sync_data.set_page_transition( | |
| 382 sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME); | |
| 383 break; | |
| 384 case content::PAGE_TRANSITION_MANUAL_SUBFRAME: | |
| 385 sync_data.set_page_transition( | |
| 386 sync_pb::SyncEnums_PageTransition_MANUAL_SUBFRAME); | |
| 387 break; | |
| 388 case content::PAGE_TRANSITION_GENERATED: | |
| 389 sync_data.set_page_transition( | |
| 390 sync_pb::SyncEnums_PageTransition_GENERATED); | |
| 391 break; | |
| 392 case content::PAGE_TRANSITION_AUTO_TOPLEVEL: | |
| 393 sync_data.set_page_transition( | |
| 394 sync_pb::SyncEnums_PageTransition_AUTO_TOPLEVEL); | |
| 395 break; | |
| 396 case content::PAGE_TRANSITION_FORM_SUBMIT: | |
| 397 sync_data.set_page_transition( | |
| 398 sync_pb::SyncEnums_PageTransition_FORM_SUBMIT); | |
| 399 break; | |
| 400 case content::PAGE_TRANSITION_RELOAD: | |
| 401 sync_data.set_page_transition( | |
| 402 sync_pb::SyncEnums_PageTransition_RELOAD); | |
| 403 break; | |
| 404 case content::PAGE_TRANSITION_KEYWORD: | |
| 405 sync_data.set_page_transition( | |
| 406 sync_pb::SyncEnums_PageTransition_KEYWORD); | |
| 407 break; | |
| 408 case content::PAGE_TRANSITION_KEYWORD_GENERATED: | |
| 409 sync_data.set_page_transition( | |
| 410 sync_pb::SyncEnums_PageTransition_KEYWORD_GENERATED); | |
| 411 break; | |
| 412 default: | |
| 413 NOTREACHED(); | |
| 414 } | |
| 415 | |
| 416 // Page transition qualifiers. | |
| 417 if (PageTransitionIsRedirect(transition_type_)) { | |
| 418 if (transition_type_ & content::PAGE_TRANSITION_CLIENT_REDIRECT) { | |
| 419 sync_data.set_redirect_type( | |
| 420 sync_pb::SyncEnums_PageTransitionRedirectType_CLIENT_REDIRECT); | |
| 421 } else if (transition_type_ & content::PAGE_TRANSITION_SERVER_REDIRECT) { | |
| 422 sync_data.set_redirect_type( | |
| 423 sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT); | |
| 424 } | |
| 425 } | |
| 426 sync_data.set_navigation_forward_back( | |
| 427 (transition_type_ & content::PAGE_TRANSITION_FORWARD_BACK) != 0); | |
| 428 sync_data.set_navigation_from_address_bar( | |
| 429 (transition_type_ & content::PAGE_TRANSITION_FROM_ADDRESS_BAR) != 0); | |
| 430 sync_data.set_navigation_home_page( | |
| 431 (transition_type_ & content::PAGE_TRANSITION_HOME_PAGE) != 0); | |
| 432 sync_data.set_navigation_chain_start( | |
| 433 (transition_type_ & content::PAGE_TRANSITION_CHAIN_START) != 0); | |
| 434 sync_data.set_navigation_chain_end( | |
| 435 (transition_type_ & content::PAGE_TRANSITION_CHAIN_END) != 0); | |
| 436 | |
| 437 sync_data.set_unique_id(unique_id_); | |
| 438 sync_data.set_timestamp_msec(syncer::TimeToProtoTime(timestamp_)); | |
| 439 // The full-resolution timestamp works as a global ID. | |
| 440 sync_data.set_global_id(timestamp_.ToInternalValue()); | |
| 441 | |
| 442 sync_data.set_search_terms(UTF16ToUTF8(search_terms_)); | |
| 443 | |
| 444 if (favicon_url_.is_valid()) | |
| 445 sync_data.set_favicon_url(favicon_url_.spec()); | |
| 446 | |
| 447 return sync_data; | |
| 448 } | |
| 449 | |
| 450 // static | |
| 451 std::vector<NavigationEntry*> | |
| 452 TabNavigation::CreateNavigationEntriesFromTabNavigations( | |
| 453 const std::vector<TabNavigation>& navigations, | |
| 454 content::BrowserContext* browser_context) { | |
| 455 int page_id = 0; | |
| 456 std::vector<NavigationEntry*> entries; | |
| 457 for (std::vector<TabNavigation>::const_iterator it = navigations.begin(); | |
| 458 it != navigations.end(); ++it) { | |
| 459 entries.push_back( | |
| 460 it->ToNavigationEntry(page_id, browser_context).release()); | |
| 461 ++page_id; | |
| 462 } | |
| 463 return entries; | |
| 464 } | |
| 465 | 13 |
| 466 // SessionTab ----------------------------------------------------------------- | 14 // SessionTab ----------------------------------------------------------------- |
| 467 | 15 |
| 468 SessionTab::SessionTab() | 16 SessionTab::SessionTab() |
| 469 : tab_visual_index(-1), | 17 : tab_visual_index(-1), |
| 470 current_navigation_index(-1), | 18 current_navigation_index(-1), |
| 471 pinned(false) { | 19 pinned(false) { |
| 472 } | 20 } |
| 473 | 21 |
| 474 SessionTab::~SessionTab() { | 22 SessionTab::~SessionTab() { |
| 475 } | 23 } |
| 476 | 24 |
| 477 void SessionTab::SetFromSyncData(const sync_pb::SessionTab& sync_data, | 25 void SessionTab::SetFromSyncData(const sync_pb::SessionTab& sync_data, |
| 478 base::Time timestamp) { | 26 base::Time timestamp) { |
| 479 window_id.set_id(sync_data.window_id()); | 27 window_id.set_id(sync_data.window_id()); |
| 480 tab_id.set_id(sync_data.tab_id()); | 28 tab_id.set_id(sync_data.tab_id()); |
| 481 tab_visual_index = sync_data.tab_visual_index(); | 29 tab_visual_index = sync_data.tab_visual_index(); |
| 482 current_navigation_index = sync_data.current_navigation_index(); | 30 current_navigation_index = sync_data.current_navigation_index(); |
| 483 pinned = sync_data.pinned(); | 31 pinned = sync_data.pinned(); |
| 484 extension_app_id = sync_data.extension_app_id(); | 32 extension_app_id = sync_data.extension_app_id(); |
| 485 user_agent_override.clear(); | 33 user_agent_override.clear(); |
| 486 this->timestamp = timestamp; | 34 this->timestamp = timestamp; |
| 487 navigations.clear(); | 35 navigations.clear(); |
| 488 for (int i = 0; i < sync_data.navigation_size(); ++i) { | 36 for (int i = 0; i < sync_data.navigation_size(); ++i) { |
| 489 navigations.push_back( | 37 navigations.push_back( |
| 490 TabNavigation::FromSyncData(i, sync_data.navigation(i))); | 38 SerializedNavigationEntry::FromSyncData(i, sync_data.navigation(i))); |
| 491 } | 39 } |
| 492 session_storage_persistent_id.clear(); | 40 session_storage_persistent_id.clear(); |
| 493 } | 41 } |
| 494 | 42 |
| 495 sync_pb::SessionTab SessionTab::ToSyncData() const { | 43 sync_pb::SessionTab SessionTab::ToSyncData() const { |
| 496 sync_pb::SessionTab sync_data; | 44 sync_pb::SessionTab sync_data; |
| 497 sync_data.set_tab_id(tab_id.id()); | 45 sync_data.set_tab_id(tab_id.id()); |
| 498 sync_data.set_window_id(window_id.id()); | 46 sync_data.set_window_id(window_id.id()); |
| 499 sync_data.set_tab_visual_index(tab_visual_index); | 47 sync_data.set_tab_visual_index(tab_visual_index); |
| 500 sync_data.set_current_navigation_index(current_navigation_index); | 48 sync_data.set_current_navigation_index(current_navigation_index); |
| 501 sync_data.set_pinned(pinned); | 49 sync_data.set_pinned(pinned); |
| 502 sync_data.set_extension_app_id(extension_app_id); | 50 sync_data.set_extension_app_id(extension_app_id); |
| 503 for (std::vector<TabNavigation>::const_iterator it = navigations.begin(); | 51 for (std::vector<SerializedNavigationEntry>::const_iterator |
| 504 it != navigations.end(); ++it) { | 52 it = navigations.begin(); it != navigations.end(); ++it) { |
| 505 *sync_data.add_navigation() = it->ToSyncData(); | 53 *sync_data.add_navigation() = it->ToSyncData(); |
| 506 } | 54 } |
| 507 return sync_data; | 55 return sync_data; |
| 508 } | 56 } |
| 509 | 57 |
| 510 // SessionWindow --------------------------------------------------------------- | 58 // SessionWindow --------------------------------------------------------------- |
| 511 | 59 |
| 512 SessionWindow::SessionWindow() | 60 SessionWindow::SessionWindow() |
| 513 : selected_tab_index(-1), | 61 : selected_tab_index(-1), |
| 514 type(Browser::TYPE_TABBED), | 62 type(Browser::TYPE_TABBED), |
| 515 is_constrained(true), | 63 is_constrained(true), |
| 516 show_state(ui::SHOW_STATE_DEFAULT) { | 64 show_state(ui::SHOW_STATE_DEFAULT) { |
| 517 } | 65 } |
| 518 | 66 |
| 519 SessionWindow::~SessionWindow() { | 67 SessionWindow::~SessionWindow() { |
| 520 STLDeleteElements(&tabs); | 68 STLDeleteElements(&tabs); |
| 521 } | 69 } |
| OLD | NEW |