9
9
#include " content/public/browser/favicon_status.h"
10
10
#include " content/public/browser/navigation_controller.h"
11
11
#include " content/public/browser/navigation_entry.h"
12
+ #include " content/public/common/page_state.h"
13
+ #include " content/public/common/referrer.h"
12
14
#include " sync/protocol/session_specifics.pb.h"
13
15
#include " sync/util/time.h"
14
16
#include " third_party/WebKit/public/platform/WebReferrerPolicy.h"
@@ -28,7 +30,9 @@ SerializedNavigationEntry::SerializedNavigationEntry()
28
30
is_overriding_user_agent_(false ),
29
31
http_status_code_(0 ),
30
32
is_restored_(false ),
31
- blocked_state_(STATE_INVALID) {}
33
+ blocked_state_(STATE_INVALID) {
34
+ referrer_policy_ = GetDefaultReferrerPolicy ();
35
+ }
32
36
33
37
SerializedNavigationEntry::~SerializedNavigationEntry () {}
34
38
@@ -39,10 +43,11 @@ SerializedNavigationEntry SerializedNavigationEntry::FromNavigationEntry(
39
43
SerializedNavigationEntry navigation;
40
44
navigation.index_ = index;
41
45
navigation.unique_id_ = entry.GetUniqueID ();
42
- navigation.referrer_ = entry.GetReferrer ();
46
+ navigation.referrer_url_ = entry.GetReferrer ().url ;
47
+ navigation.referrer_policy_ = entry.GetReferrer ().policy ;
43
48
navigation.virtual_url_ = entry.GetVirtualURL ();
44
49
navigation.title_ = entry.GetTitle ();
45
- navigation.page_state_ = entry.GetPageState ();
50
+ navigation.encoded_page_state_ = entry.GetPageState (). ToEncodedData ();
46
51
navigation.transition_type_ = entry.GetTransitionType ();
47
52
navigation.has_post_data_ = entry.GetHasPostData ();
48
53
navigation.post_id_ = entry.GetPostID ();
@@ -68,13 +73,11 @@ SerializedNavigationEntry SerializedNavigationEntry::FromSyncData(
68
73
SerializedNavigationEntry navigation;
69
74
navigation.index_ = index;
70
75
navigation.unique_id_ = sync_data.unique_id ();
71
- navigation.referrer_ = content::Referrer (
72
- GURL (sync_data.referrer ()),
73
- static_cast <blink::WebReferrerPolicy>(sync_data.referrer_policy ()));
76
+ navigation.referrer_url_ = GURL (sync_data.referrer ());
77
+ navigation.referrer_policy_ = sync_data.referrer_policy ();
74
78
navigation.virtual_url_ = GURL (sync_data.virtual_url ());
75
79
navigation.title_ = base::UTF8ToUTF16 (sync_data.title ());
76
- navigation.page_state_ =
77
- content::PageState::CreateFromEncodedData (sync_data.state ());
80
+ navigation.encoded_page_state_ = sync_data.state ();
78
81
79
82
uint32 transition = 0 ;
80
83
if (sync_data.has_page_transition ()) {
@@ -210,13 +213,14 @@ enum TypeMask {
210
213
// index_
211
214
// virtual_url_
212
215
// title_
213
- // page_state_
216
+ // encoded_page_state_
214
217
// transition_type_
215
218
//
216
219
// Added on later:
217
220
//
218
221
// type_mask (has_post_data_)
219
- // referrer_
222
+ // referrer_url_
223
+ // referrer_policy_
220
224
// original_request_url_
221
225
// is_overriding_user_agent_
222
226
// timestamp_
@@ -234,12 +238,8 @@ void SerializedNavigationEntry::WriteToPickle(int max_size,
234
238
235
239
WriteString16ToPickle (pickle, &bytes_written, max_size, title_);
236
240
237
- content::PageState page_state = page_state_;
238
- if (has_post_data_)
239
- page_state = page_state.RemovePasswordData ();
240
-
241
- WriteStringToPickle (pickle, &bytes_written, max_size,
242
- page_state.ToEncodedData ());
241
+ const std::string encoded_page_state = GetSanitizedPageStateForPickle ();
242
+ WriteStringToPickle (pickle, &bytes_written, max_size, encoded_page_state);
243
243
244
244
pickle->WriteInt (transition_type_);
245
245
@@ -248,9 +248,9 @@ void SerializedNavigationEntry::WriteToPickle(int max_size,
248
248
249
249
WriteStringToPickle (
250
250
pickle, &bytes_written, max_size,
251
- referrer_. url . is_valid () ? referrer_. url .spec () : std::string ());
251
+ referrer_url_. is_valid () ? referrer_url_ .spec () : std::string ());
252
252
253
- pickle->WriteInt (referrer_. policy );
253
+ pickle->WriteInt (referrer_policy_ );
254
254
255
255
// Save info required to override the user agent.
256
256
WriteStringToPickle (
@@ -267,16 +267,15 @@ void SerializedNavigationEntry::WriteToPickle(int max_size,
267
267
268
268
bool SerializedNavigationEntry::ReadFromPickle (PickleIterator* iterator) {
269
269
*this = SerializedNavigationEntry ();
270
- std::string virtual_url_spec, page_state_data ;
270
+ std::string virtual_url_spec;
271
271
int transition_type_int = 0 ;
272
272
if (!iterator->ReadInt (&index_) ||
273
273
!iterator->ReadString (&virtual_url_spec) ||
274
274
!iterator->ReadString16 (&title_) ||
275
- !iterator->ReadString (&page_state_data ) ||
275
+ !iterator->ReadString (&encoded_page_state_ ) ||
276
276
!iterator->ReadInt (&transition_type_int))
277
277
return false ;
278
278
virtual_url_ = GURL (virtual_url_spec);
279
- page_state_ = content::PageState::CreateFromEncodedData (page_state_data);
280
279
transition_type_ = ui::PageTransitionFromInt (transition_type_int);
281
280
282
281
// type_mask did not always exist in the written stream. As such, we
@@ -291,15 +290,12 @@ bool SerializedNavigationEntry::ReadFromPickle(PickleIterator* iterator) {
291
290
std::string referrer_spec;
292
291
if (!iterator->ReadString (&referrer_spec))
293
292
referrer_spec = std::string ();
293
+ referrer_url_ = GURL (referrer_spec);
294
+
294
295
// The "referrer policy" property was added even later, so we fall back to
295
296
// the default policy if the property is not present.
296
- int policy_int;
297
- blink::WebReferrerPolicy policy;
298
- if (iterator->ReadInt (&policy_int))
299
- policy = static_cast <blink::WebReferrerPolicy>(policy_int);
300
- else
301
- policy = blink::WebReferrerPolicyDefault;
302
- referrer_ = content::Referrer (GURL (referrer_spec), policy);
297
+ if (!iterator->ReadInt (&referrer_policy_))
298
+ referrer_policy_ = GetDefaultReferrerPolicy ();
303
299
304
300
// If the original URL can't be found, leave it empty.
305
301
std::string original_request_url_spec;
@@ -339,7 +335,9 @@ scoped_ptr<NavigationEntry> SerializedNavigationEntry::ToNavigationEntry(
339
335
scoped_ptr<NavigationEntry> entry (
340
336
content::NavigationController::CreateNavigationEntry (
341
337
virtual_url_,
342
- referrer_,
338
+ content::Referrer (
339
+ referrer_url_,
340
+ static_cast <blink::WebReferrerPolicy>(referrer_policy_)),
343
341
// Use a transition type of reload so that we don't incorrectly
344
342
// increase the typed count.
345
343
ui::PAGE_TRANSITION_RELOAD,
@@ -349,7 +347,8 @@ scoped_ptr<NavigationEntry> SerializedNavigationEntry::ToNavigationEntry(
349
347
browser_context));
350
348
351
349
entry->SetTitle (title_);
352
- entry->SetPageState (page_state_);
350
+ entry->SetPageState (
351
+ content::PageState::CreateFromEncodedData (encoded_page_state_));
353
352
entry->SetPageID (page_id);
354
353
entry->SetHasPostData (has_post_data_);
355
354
entry->SetPostID (post_id_);
@@ -372,8 +371,8 @@ scoped_ptr<NavigationEntry> SerializedNavigationEntry::ToNavigationEntry(
372
371
sync_pb::TabNavigation SerializedNavigationEntry::ToSyncData () const {
373
372
sync_pb::TabNavigation sync_data;
374
373
sync_data.set_virtual_url (virtual_url_.spec ());
375
- sync_data.set_referrer (referrer_. url .spec ());
376
- sync_data.set_referrer_policy (referrer_. policy );
374
+ sync_data.set_referrer (referrer_url_ .spec ());
375
+ sync_data.set_referrer_policy (referrer_policy_ );
377
376
sync_data.set_title (base::UTF16ToUTF8 (title_));
378
377
379
378
// Page transition core.
@@ -509,16 +508,42 @@ std::vector<NavigationEntry*> SerializedNavigationEntry::ToNavigationEntries(
509
508
return entries;
510
509
}
511
510
511
+ // TODO(rohitrao): Move this content-specific code into a
512
+ // SerializedNavigationEntryHelper class.
513
+ int SerializedNavigationEntry::GetDefaultReferrerPolicy () const {
514
+ return blink::WebReferrerPolicyDefault;
515
+ }
516
+
517
+ // TODO(rohitrao): Move this content-specific code into a
518
+ // SerializedNavigationEntryHelper class.
519
+ std::string SerializedNavigationEntry::GetSanitizedPageStateForPickle () const {
520
+ content::PageState page_state =
521
+ content::PageState::CreateFromEncodedData (encoded_page_state_);
522
+ if (has_post_data_)
523
+ page_state = page_state.RemovePasswordData ();
524
+
525
+ return page_state.ToEncodedData ();
526
+ }
527
+
528
+ // TODO(rohitrao): Move this content-specific code into a
529
+ // SerializedNavigationEntryHelper class.
512
530
void SerializedNavigationEntry::Sanitize () {
531
+ content::Referrer old_referrer (
532
+ referrer_url_,
533
+ static_cast <blink::WebReferrerPolicy>(referrer_policy_));
513
534
content::Referrer new_referrer =
514
- content::Referrer::SanitizeForRequest (virtual_url_, referrer_ );
535
+ content::Referrer::SanitizeForRequest (virtual_url_, old_referrer );
515
536
516
537
// No need to compare the policy, as it doesn't change during
517
538
// sanitization. If there has been a change, the referrer needs to be
518
539
// stripped from the page state as well.
519
- if (referrer_.url != new_referrer.url ) {
520
- referrer_ = content::Referrer ();
521
- page_state_ = page_state_.RemoveReferrer ();
540
+ if (referrer_url_ != new_referrer.url ) {
541
+ referrer_url_ = GURL ();
542
+ referrer_policy_ = GetDefaultReferrerPolicy ();
543
+ encoded_page_state_ =
544
+ content::PageState::CreateFromEncodedData (encoded_page_state_)
545
+ .RemoveReferrer ()
546
+ .ToEncodedData ();
522
547
}
523
548
}
524
549
0 commit comments