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

Side by Side Diff: components/sessions/core/serialized_navigation_entry.cc

Issue 2921883003: [Sync] Ensure referrer is recorded regardless of policy conversion (Closed)
Patch Set: Tighten Created 3 years, 6 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "components/sessions/core/serialized_navigation_entry.h" 5 #include "components/sessions/core/serialized_navigation_entry.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/macros.h"
9 #include "base/pickle.h" 10 #include "base/pickle.h"
10 #include "base/strings/utf_string_conversions.h" 11 #include "base/strings/utf_string_conversions.h"
11 #include "base/trace_event/memory_usage_estimator.h" 12 #include "base/trace_event/memory_usage_estimator.h"
12 #include "components/sessions/core/serialized_navigation_driver.h" 13 #include "components/sessions/core/serialized_navigation_driver.h"
13 #include "components/sync/base/time.h" 14 #include "components/sync/base/time.h"
14 #include "components/sync/protocol/session_specifics.pb.h" 15 #include "components/sync/protocol/session_specifics.pb.h"
15 16
16 namespace sessions { 17 namespace sessions {
17 18
18 // TODO(treib): Remove, not needed anymore. crbug.com/627747 19 // TODO(treib): Remove, not needed anymore. crbug.com/627747
19 const char kSearchTermsKey[] = "search_terms"; 20 const char kSearchTermsKey[] = "search_terms";
20 21
22 // The previous referrer policy value corresponding to |Never|.
23 const int kObsoleteReferrerPolicyNever = 2;
24
21 SerializedNavigationEntry::SerializedNavigationEntry() 25 SerializedNavigationEntry::SerializedNavigationEntry()
22 : index_(-1), 26 : index_(-1),
23 unique_id_(0), 27 unique_id_(0),
24 transition_type_(ui::PAGE_TRANSITION_TYPED), 28 transition_type_(ui::PAGE_TRANSITION_TYPED),
25 has_post_data_(false), 29 has_post_data_(false),
26 post_id_(-1), 30 post_id_(-1),
27 is_overriding_user_agent_(false), 31 is_overriding_user_agent_(false),
28 http_status_code_(0), 32 http_status_code_(0),
29 is_restored_(false), 33 is_restored_(false),
30 blocked_state_(STATE_INVALID), 34 blocked_state_(STATE_INVALID),
(...skipping 10 matching lines...) Expand all
41 SerializedNavigationEntry SerializedNavigationEntry::FromSyncData( 45 SerializedNavigationEntry SerializedNavigationEntry::FromSyncData(
42 int index, 46 int index,
43 const sync_pb::TabNavigation& sync_data) { 47 const sync_pb::TabNavigation& sync_data) {
44 SerializedNavigationEntry navigation; 48 SerializedNavigationEntry navigation;
45 navigation.index_ = index; 49 navigation.index_ = index;
46 navigation.unique_id_ = sync_data.unique_id(); 50 navigation.unique_id_ = sync_data.unique_id();
47 if (sync_data.has_correct_referrer_policy()) { 51 if (sync_data.has_correct_referrer_policy()) {
48 navigation.referrer_url_ = GURL(sync_data.referrer()); 52 navigation.referrer_url_ = GURL(sync_data.referrer());
49 navigation.referrer_policy_ = sync_data.correct_referrer_policy(); 53 navigation.referrer_policy_ = sync_data.correct_referrer_policy();
50 } else { 54 } else {
51 int mapped_referrer_policy; 55 navigation.referrer_url_ = GURL();
52 if (SerializedNavigationDriver::Get()->MapReferrerPolicyToNewValues( 56 navigation.referrer_policy_ = kObsoleteReferrerPolicyNever;
53 sync_data.obsolete_referrer_policy(), &mapped_referrer_policy)) {
54 navigation.referrer_url_ = GURL(sync_data.referrer());
55 } else {
56 navigation.referrer_url_ = GURL();
57 }
58 navigation.referrer_policy_ = mapped_referrer_policy;
59 } 57 }
60 navigation.virtual_url_ = GURL(sync_data.virtual_url()); 58 navigation.virtual_url_ = GURL(sync_data.virtual_url());
61 navigation.title_ = base::UTF8ToUTF16(sync_data.title()); 59 navigation.title_ = base::UTF8ToUTF16(sync_data.title());
62 60
63 uint32_t transition = 0; 61 uint32_t transition = 0;
64 if (sync_data.has_page_transition()) { 62 if (sync_data.has_page_transition()) {
65 switch (sync_data.page_transition()) { 63 switch (sync_data.page_transition()) {
66 case sync_pb::SyncEnums_PageTransition_LINK: 64 case sync_pb::SyncEnums_PageTransition_LINK:
67 transition = ui::PAGE_TRANSITION_LINK; 65 transition = ui::PAGE_TRANSITION_LINK;
68 break; 66 break;
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 227
230 const std::string encoded_page_state = 228 const std::string encoded_page_state =
231 SerializedNavigationDriver::Get()->GetSanitizedPageStateForPickle(this); 229 SerializedNavigationDriver::Get()->GetSanitizedPageStateForPickle(this);
232 WriteStringToPickle(pickle, &bytes_written, max_size, encoded_page_state); 230 WriteStringToPickle(pickle, &bytes_written, max_size, encoded_page_state);
233 231
234 pickle->WriteInt(transition_type_); 232 pickle->WriteInt(transition_type_);
235 233
236 const int type_mask = has_post_data_ ? HAS_POST_DATA : 0; 234 const int type_mask = has_post_data_ ? HAS_POST_DATA : 0;
237 pickle->WriteInt(type_mask); 235 pickle->WriteInt(type_mask);
238 236
239 int mapped_referrer_policy; 237 WriteStringToPickle(pickle, &bytes_written, max_size, referrer_url_.spec());
240 if (SerializedNavigationDriver::Get()->MapReferrerPolicyToOldValues( 238
241 referrer_policy_, &mapped_referrer_policy) && 239 // This field was deprecated in m61, but we still write it to the pickle for
242 referrer_url_.is_valid()) { 240 // forwards compatibility.
243 WriteStringToPickle(pickle, &bytes_written, max_size, referrer_url_.spec()); 241 pickle->WriteInt(kObsoleteReferrerPolicyNever);
244 } else {
245 WriteStringToPickle(pickle, &bytes_written, max_size, std::string());
246 }
247 pickle->WriteInt(mapped_referrer_policy);
248 242
249 // Save info required to override the user agent. 243 // Save info required to override the user agent.
250 WriteStringToPickle( 244 WriteStringToPickle(
251 pickle, &bytes_written, max_size, 245 pickle, &bytes_written, max_size,
252 original_request_url_.is_valid() ? 246 original_request_url_.is_valid() ?
253 original_request_url_.spec() : std::string()); 247 original_request_url_.spec() : std::string());
254 pickle->WriteBool(is_overriding_user_agent_); 248 pickle->WriteBool(is_overriding_user_agent_);
255 pickle->WriteInt64(timestamp_.ToInternalValue()); 249 pickle->WriteInt64(timestamp_.ToInternalValue());
256 250
257 WriteString16ToPickle(pickle, &bytes_written, max_size, search_terms_); 251 WriteString16ToPickle(pickle, &bytes_written, max_size, search_terms_);
(...skipping 29 matching lines...) Expand all
287 281
288 if (has_type_mask) { 282 if (has_type_mask) {
289 has_post_data_ = type_mask & HAS_POST_DATA; 283 has_post_data_ = type_mask & HAS_POST_DATA;
290 // the "referrer" property was added after type_mask to the written 284 // the "referrer" property was added after type_mask to the written
291 // stream. As such, we don't fail if it can't be read. 285 // stream. As such, we don't fail if it can't be read.
292 std::string referrer_spec; 286 std::string referrer_spec;
293 if (!iterator->ReadString(&referrer_spec)) 287 if (!iterator->ReadString(&referrer_spec))
294 referrer_spec = std::string(); 288 referrer_spec = std::string();
295 referrer_url_ = GURL(referrer_spec); 289 referrer_url_ = GURL(referrer_spec);
296 290
297 // The "referrer policy" property was added even later, so we fall back to 291 // Note: due to crbug.com/450589 the initial referrer policy is incorrect,
298 // the default policy if the property is not present. 292 // and ignored. A correct referrer policy is extracted later (see
299 // 293 // |correct_referrer_policy| below).
300 // Note: due to crbug.com/450589 this value might be incorrect, and a 294 int ignored_referrer_policy;
301 // corrected version is stored later in the pickle. 295 ignore_result(iterator->ReadInt(&ignored_referrer_policy));
302 if (!iterator->ReadInt(&referrer_policy_)) {
303 referrer_policy_ =
304 SerializedNavigationDriver::Get()->GetDefaultReferrerPolicy();
305 }
306 296
307 // If the original URL can't be found, leave it empty. 297 // If the original URL can't be found, leave it empty.
308 std::string original_request_url_spec; 298 std::string original_request_url_spec;
309 if (!iterator->ReadString(&original_request_url_spec)) 299 if (!iterator->ReadString(&original_request_url_spec))
310 original_request_url_spec = std::string(); 300 original_request_url_spec = std::string();
311 original_request_url_ = GURL(original_request_url_spec); 301 original_request_url_ = GURL(original_request_url_spec);
312 302
313 // Default to not overriding the user agent if we don't have info. 303 // Default to not overriding the user agent if we don't have info.
314 if (!iterator->ReadBool(&is_overriding_user_agent_)) 304 if (!iterator->ReadBool(&is_overriding_user_agent_))
315 is_overriding_user_agent_ = false; 305 is_overriding_user_agent_ = false;
(...skipping 10 matching lines...) Expand all
326 search_terms_.clear(); 316 search_terms_.clear();
327 317
328 if (!iterator->ReadInt(&http_status_code_)) 318 if (!iterator->ReadInt(&http_status_code_))
329 http_status_code_ = 0; 319 http_status_code_ = 0;
330 320
331 // Correct referrer policy (if present). 321 // Correct referrer policy (if present).
332 int correct_referrer_policy; 322 int correct_referrer_policy;
333 if (iterator->ReadInt(&correct_referrer_policy)) { 323 if (iterator->ReadInt(&correct_referrer_policy)) {
334 referrer_policy_ = correct_referrer_policy; 324 referrer_policy_ = correct_referrer_policy;
335 } else { 325 } else {
336 int mapped_referrer_policy;
337 if (!SerializedNavigationDriver::Get()->MapReferrerPolicyToNewValues(
338 referrer_policy_, &mapped_referrer_policy)) {
339 referrer_url_ = GURL();
340 }
341 referrer_policy_ = mapped_referrer_policy;
342 encoded_page_state_ = 326 encoded_page_state_ =
343 SerializedNavigationDriver::Get()->StripReferrerFromPageState( 327 SerializedNavigationDriver::Get()->StripReferrerFromPageState(
344 encoded_page_state_); 328 encoded_page_state_);
345 } 329 }
346 330
347 int extended_info_map_size = 0; 331 int extended_info_map_size = 0;
348 if (iterator->ReadInt(&extended_info_map_size) && 332 if (iterator->ReadInt(&extended_info_map_size) &&
349 extended_info_map_size > 0) { 333 extended_info_map_size > 0) {
350 for (int i = 0; i < extended_info_map_size; ++i) { 334 for (int i = 0; i < extended_info_map_size; ++i) {
351 std::string key; 335 std::string key;
352 std::string value; 336 std::string value;
353 if (iterator->ReadString(&key) && iterator->ReadString(&value)) 337 if (iterator->ReadString(&key) && iterator->ReadString(&value))
354 extended_info_map_[key] = value; 338 extended_info_map_[key] = value;
355 } 339 }
356 } 340 }
357 } 341 }
358 342
359 SerializedNavigationDriver::Get()->Sanitize(this); 343 SerializedNavigationDriver::Get()->Sanitize(this);
360 344
361 is_restored_ = true; 345 is_restored_ = true;
362 346
363 return true; 347 return true;
364 } 348 }
365 349
366 // TODO(zea): perhaps sync state (scroll position, form entries, etc.) as well? 350 // TODO(zea): perhaps sync state (scroll position, form entries, etc.) as well?
367 // See http://crbug.com/67068. 351 // See http://crbug.com/67068.
368 sync_pb::TabNavigation SerializedNavigationEntry::ToSyncData() const { 352 sync_pb::TabNavigation SerializedNavigationEntry::ToSyncData() const {
369 sync_pb::TabNavigation sync_data; 353 sync_pb::TabNavigation sync_data;
370 sync_data.set_virtual_url(virtual_url_.spec()); 354 sync_data.set_virtual_url(virtual_url_.spec());
371 int mapped_referrer_policy; 355 sync_data.set_referrer(referrer_url_.spec());
372 if (SerializedNavigationDriver::Get()->MapReferrerPolicyToOldValues(
373 referrer_policy_, &mapped_referrer_policy)) {
374 sync_data.set_referrer(referrer_url_.spec());
375 } else {
376 sync_data.set_referrer(std::string());
377 }
378 sync_data.set_obsolete_referrer_policy(mapped_referrer_policy);
379 sync_data.set_correct_referrer_policy(referrer_policy_); 356 sync_data.set_correct_referrer_policy(referrer_policy_);
380 sync_data.set_title(base::UTF16ToUTF8(title_)); 357 sync_data.set_title(base::UTF16ToUTF8(title_));
381 358
382 // Page transition core. 359 // Page transition core.
383 static_assert(static_cast<int32_t>(ui::PAGE_TRANSITION_LAST_CORE) == 360 static_assert(static_cast<int32_t>(ui::PAGE_TRANSITION_LAST_CORE) ==
384 static_cast<int32_t>(ui::PAGE_TRANSITION_KEYWORD_GENERATED), 361 static_cast<int32_t>(ui::PAGE_TRANSITION_KEYWORD_GENERATED),
385 "PAGE_TRANSITION_LAST_CORE must equal " 362 "PAGE_TRANSITION_LAST_CORE must equal "
386 "PAGE_TRANSITION_KEYWORD_GENERATED"); 363 "PAGE_TRANSITION_KEYWORD_GENERATED");
387 switch (ui::PageTransitionStripQualifier(transition_type_)) { 364 switch (ui::PageTransitionStripQualifier(transition_type_)) {
388 case ui::PAGE_TRANSITION_LINK: 365 case ui::PAGE_TRANSITION_LINK:
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 EstimateMemoryUsage(encoded_page_state_) + 487 EstimateMemoryUsage(encoded_page_state_) +
511 EstimateMemoryUsage(original_request_url_) + 488 EstimateMemoryUsage(original_request_url_) +
512 EstimateMemoryUsage(search_terms_) + 489 EstimateMemoryUsage(search_terms_) +
513 EstimateMemoryUsage(favicon_url_) + 490 EstimateMemoryUsage(favicon_url_) +
514 EstimateMemoryUsage(redirect_chain_) + 491 EstimateMemoryUsage(redirect_chain_) +
515 EstimateMemoryUsage(content_pack_categories_) + 492 EstimateMemoryUsage(content_pack_categories_) +
516 EstimateMemoryUsage(extended_info_map_); 493 EstimateMemoryUsage(extended_info_map_);
517 } 494 }
518 495
519 } // namespace sessions 496 } // namespace sessions
OLDNEW
« no previous file with comments | « components/sessions/core/serialized_navigation_driver.h ('k') | components/sessions/ios/ios_serialized_navigation_driver.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698