Index: ios/web/public/crw_navigation_item_storage.mm |
diff --git a/ios/web/public/crw_navigation_item_storage.mm b/ios/web/public/crw_navigation_item_storage.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..62a6055fc1061bd476fc2e6a35a0f8bde6befbec |
--- /dev/null |
+++ b/ios/web/public/crw_navigation_item_storage.mm |
@@ -0,0 +1,154 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#import "ios/web/public/crw_navigation_item_storage.h" |
+ |
+#include "base/strings/sys_string_conversions.h" |
+#import "ios/web/navigation/nscoder_util.h" |
+#import "net/base/mac/url_conversions.h" |
+ |
+#if !defined(__has_feature) || !__has_feature(objc_arc) |
+#error "This file requires ARC support." |
+#endif |
+ |
+namespace web { |
+ |
+// Keys used to serialize navigation properties. |
+NSString* const kNavigationItemStorageURLKey = @"virtualUrlString"; |
+NSString* const kNavigationItemStorageURLDeperecatedKey = @"virtualUrl"; |
+NSString* const kNavigationItemStorageReferrerURLKey = @"referrerUrlString"; |
+NSString* const kNavigationItemStorageReferrerURLDeprecatedKey = @"referrer"; |
+NSString* const kNavigationItemStorageReferrerPolicyKey = @"referrerPolicy"; |
+NSString* const kNavigationItemStorageTimestampKey = @"timestamp"; |
+NSString* const kNavigationItemStorageTitleKey = @"title"; |
+NSString* const kNavigationItemStoragePageDisplayStateKey = @"state"; |
+NSString* const kNavigationItemStoragePOSTDataKey = @"POSTData"; |
+NSString* const kNavigationItemStorageHTTPRequestHeadersKey = @"httpHeaders"; |
+NSString* const kNavigationItemStorageSkipRepostFormConfirmationKey = |
+ @"skipResubmitDataConfirmation"; |
+NSString* const kNavigationItemStorageUseDesktopUserAgentKey = |
+ @"useDesktopUserAgent"; |
+ |
+} // namespace web |
+ |
+@implementation CRWNavigationItemStorage |
+ |
+@synthesize virtualURL = _virtualURL; |
+@synthesize referrer = _referrer; |
+@synthesize timestamp = _timestamp; |
+@synthesize title = _title; |
+@synthesize displayState = _displayState; |
+@synthesize shouldSkipRepostFormConfirmation = |
+ _shouldSkipRepostFormConfirmation; |
+@synthesize overridingUserAgent = _overridingUserAgent; |
+@synthesize POSTData = _POSTData; |
+@synthesize HTTPRequestHeaders = _HTTPRequestHeaders; |
+ |
+#pragma mark - NSObject |
+ |
+- (NSString*)description { |
+ NSMutableString* description = |
+ [NSMutableString stringWithString:[super description]]; |
+ [description appendFormat:@"virtualURL : %s, ", _virtualURL.spec().c_str()]; |
+ [description appendFormat:@"referrer : %s, ", _referrer.url.spec().c_str()]; |
+ [description appendFormat:@"timestamp : %f, ", _timestamp.ToCFAbsoluteTime()]; |
+ [description appendFormat:@"title : %@, ", base::SysUTF16ToNSString(_title)]; |
+ [description |
+ appendFormat:@"displayState : %@", _displayState.GetDescription()]; |
+ [description appendFormat:@"skipRepostConfirmation : %@, ", |
+ @(_shouldSkipRepostFormConfirmation)]; |
+ [description |
+ appendFormat:@"overridingUserAgent : %@, ", @(_overridingUserAgent)]; |
+ [description appendFormat:@"POSTData : %@, ", _POSTData]; |
+ [description appendFormat:@"HTTPRequestHeaders : %@", _HTTPRequestHeaders]; |
+ return description; |
+} |
+ |
+#pragma mark - NSCoding |
+ |
+- (instancetype)initWithCoder:(NSCoder*)aDecoder { |
+ self = [super init]; |
+ if (self) { |
+ // Desktop chrome only persists virtualUrl_ and uses it to feed the url |
+ // when creating a NavigationEntry. |
+ if ([aDecoder containsValueForKey:web::kNavigationItemStorageURLKey]) { |
+ _virtualURL = GURL(web::nscoder_util::DecodeString( |
+ aDecoder, web::kNavigationItemStorageURLKey)); |
+ } else { |
+ // Backward compatibility. |
+ _virtualURL = net::GURLWithNSURL([aDecoder |
+ decodeObjectForKey:web::kNavigationItemStorageURLDeperecatedKey]); |
+ } |
+ |
+ if ([aDecoder |
+ containsValueForKey:web::kNavigationItemStorageReferrerURLKey]) { |
+ const std::string referrerString(web::nscoder_util::DecodeString( |
+ aDecoder, web::kNavigationItemStorageReferrerURLKey)); |
+ web::ReferrerPolicy referrerPolicy = |
+ static_cast<web::ReferrerPolicy>([aDecoder |
+ decodeIntForKey:web::kNavigationItemStorageReferrerPolicyKey]); |
+ _referrer = web::Referrer(GURL(referrerString), referrerPolicy); |
+ } else { |
+ // Backward compatibility. |
+ NSURL* referrerURL = |
+ [aDecoder decodeObjectForKey: |
+ web::kNavigationItemStorageReferrerURLDeprecatedKey]; |
+ _referrer = web::Referrer(net::GURLWithNSURL(referrerURL), |
+ web::ReferrerPolicyDefault); |
+ } |
+ |
+ if ([aDecoder |
+ containsValueForKey:web::kNavigationItemStorageTimestampKey]) { |
+ int64_t us = |
+ [aDecoder decodeInt64ForKey:web::kNavigationItemStorageTimestampKey]; |
+ _timestamp = base::Time::FromInternalValue(us); |
+ } |
+ |
+ NSString* title = |
+ [aDecoder decodeObjectForKey:web::kNavigationItemStorageTitleKey]; |
+ // Use a transition type of reload so that we don't incorrectly increase |
+ // the typed count. This is what desktop chrome does. |
+ _title = base::SysNSStringToUTF16(title); |
+ NSDictionary* serializedDisplayState = [aDecoder |
+ decodeObjectForKey:web::kNavigationItemStoragePageDisplayStateKey]; |
+ _displayState = web::PageDisplayState(serializedDisplayState); |
+ _shouldSkipRepostFormConfirmation = |
+ [aDecoder decodeBoolForKey: |
+ web::kNavigationItemStorageSkipRepostFormConfirmationKey]; |
+ _overridingUserAgent = [aDecoder |
+ decodeBoolForKey:web::kNavigationItemStorageUseDesktopUserAgentKey]; |
+ _POSTData = |
+ [aDecoder decodeObjectForKey:web::kNavigationItemStoragePOSTDataKey]; |
+ _HTTPRequestHeaders = [aDecoder |
+ decodeObjectForKey:web::kNavigationItemStorageHTTPRequestHeadersKey]; |
+ } |
+ return self; |
+} |
+ |
+- (void)encodeWithCoder:(NSCoder*)aCoder { |
+ // Desktop Chrome doesn't persist |url_| or |originalUrl_|, only |
+ // |virtualUrl_|. |
+ web::nscoder_util::EncodeString(aCoder, web::kNavigationItemStorageURLKey, |
+ _virtualURL.spec()); |
+ web::nscoder_util::EncodeString( |
+ aCoder, web::kNavigationItemStorageReferrerURLKey, _referrer.url.spec()); |
+ [aCoder encodeInt:_referrer.policy |
+ forKey:web::kNavigationItemStorageReferrerPolicyKey]; |
+ [aCoder encodeInt64:_timestamp.ToInternalValue() |
+ forKey:web::kNavigationItemStorageTimestampKey]; |
+ |
+ [aCoder encodeObject:base::SysUTF16ToNSString(_title) |
+ forKey:web::kNavigationItemStorageTitleKey]; |
+ [aCoder encodeObject:_displayState.GetSerialization() |
+ forKey:web::kNavigationItemStoragePageDisplayStateKey]; |
+ [aCoder encodeBool:_shouldSkipRepostFormConfirmation |
+ forKey:web::kNavigationItemStorageSkipRepostFormConfirmationKey]; |
+ [aCoder encodeBool:_overridingUserAgent |
+ forKey:web::kNavigationItemStorageUseDesktopUserAgentKey]; |
+ [aCoder encodeObject:_POSTData forKey:web::kNavigationItemStoragePOSTDataKey]; |
+ [aCoder encodeObject:_HTTPRequestHeaders |
+ forKey:web::kNavigationItemStorageHTTPRequestHeadersKey]; |
+} |
+ |
+@end |