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

Side by Side Diff: ios/web/navigation/crw_session_entry.mm

Issue 2664113003: Moved serialization out of CRWSessionEntry. (Closed)
Patch Set: Created 3 years, 10 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 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 #import "ios/web/navigation/crw_session_entry.h" 5 #import "ios/web/navigation/crw_session_entry.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 @"skipResubmitDataConfirmation"; 43 @"skipResubmitDataConfirmation";
44 NSString* const kSessionEntryUseDesktopUserAgentKey = @"useDesktopUserAgent"; 44 NSString* const kSessionEntryUseDesktopUserAgentKey = @"useDesktopUserAgent";
45 } 45 }
46 46
47 @interface CRWSessionEntry () { 47 @interface CRWSessionEntry () {
48 // The NavigationItemImpl corresponding to this CRWSessionEntry. 48 // The NavigationItemImpl corresponding to this CRWSessionEntry.
49 // TODO(stuartmorgan): Move ownership to NavigationManagerImpl. 49 // TODO(stuartmorgan): Move ownership to NavigationManagerImpl.
50 std::unique_ptr<web::NavigationItemImpl> _navigationItem; 50 std::unique_ptr<web::NavigationItemImpl> _navigationItem;
51 } 51 }
52 52
53 // Converts a serialized NSDictionary to a web::PageDisplayState.
54 + (web::PageDisplayState)pageDisplayStateFromDictionary:
55 (NSDictionary*)dictionary;
56 // Serializes a web::PageDisplayState to an NSDictionary.
57 + (NSDictionary*)dictionaryFromPageDisplayState:
58 (const web::PageDisplayState&)displayState;
59 // Returns a readable description of |displayState|. 53 // Returns a readable description of |displayState|.
60 + (NSString*)descriptionForPageDisplayState: 54 + (NSString*)descriptionForPageDisplayState:
61 (const web::PageDisplayState&)displayState; 55 (const web::PageDisplayState&)displayState;
62 @end 56 @end
63 57
64 @implementation CRWSessionEntry 58 @implementation CRWSessionEntry
65 59
66 - (instancetype)initWithNavigationItem: 60 - (instancetype)initWithNavigationItem:
67 (std::unique_ptr<web::NavigationItem>)item { 61 (std::unique_ptr<web::NavigationItem>)item {
68 self = [super init]; 62 self = [super init];
69 if (self) { 63 if (self) {
70 _navigationItem.reset( 64 _navigationItem.reset(
71 static_cast<web::NavigationItemImpl*>(item.release())); 65 static_cast<web::NavigationItemImpl*>(item.release()));
72 } 66 }
73 return self; 67 return self;
74 } 68 }
75 69
76 - (instancetype)initWithCoder:(NSCoder*)aDecoder {
77 self = [super init];
78 if (self) {
79 _navigationItem.reset(new web::NavigationItemImpl());
80
81 // Desktop chrome only persists virtualUrl_ and uses it to feed the url
82 // when creating a NavigationEntry.
83 GURL url;
84 if ([aDecoder containsValueForKey:web::kSessionEntryURLKey]) {
85 url = GURL(
86 web::nscoder_util::DecodeString(aDecoder, web::kSessionEntryURLKey));
87 } else {
88 // Backward compatibility.
89 url = net::GURLWithNSURL(
90 [aDecoder decodeObjectForKey:web::kSessionEntryURLDeperecatedKey]);
91 }
92 _navigationItem->SetOriginalRequestURL(url);
93 _navigationItem->SetURL(url);
94
95 if ([aDecoder containsValueForKey:web::kSessionEntryReferrerURLKey]) {
96 const std::string referrerString(web::nscoder_util::DecodeString(
97 aDecoder, web::kSessionEntryReferrerURLKey));
98 web::ReferrerPolicy referrerPolicy = static_cast<web::ReferrerPolicy>(
99 [aDecoder decodeIntForKey:web::kSessionEntryReferrerPolicyKey]);
100 _navigationItem->SetReferrer(
101 web::Referrer(GURL(referrerString), referrerPolicy));
102 } else {
103 // Backward compatibility.
104 NSURL* referrer = [aDecoder
105 decodeObjectForKey:web::kSessionEntryReferrerURLDeprecatedKey];
106 _navigationItem->SetReferrer(web::Referrer(
107 net::GURLWithNSURL(referrer), web::ReferrerPolicyDefault));
108 }
109
110 if ([aDecoder containsValueForKey:web::kSessionEntryTimestampKey]) {
111 int64_t us = [aDecoder decodeInt64ForKey:web::kSessionEntryTimestampKey];
112 _navigationItem->SetTimestamp(base::Time::FromInternalValue(us));
113 }
114
115 NSString* title = [aDecoder decodeObjectForKey:web::kSessionEntryTitleKey];
116 // Use a transition type of reload so that we don't incorrectly increase
117 // the typed count. This is what desktop chrome does.
118 _navigationItem->SetTitle(base::SysNSStringToUTF16(title));
119 _navigationItem->SetTransitionType(ui::PAGE_TRANSITION_RELOAD);
120 _navigationItem->SetPageDisplayState([[self class]
121 pageDisplayStateFromDictionary:
122 [aDecoder
123 decodeObjectForKey:web::kSessionEntryPageScrollStateKey]]);
124 _navigationItem->SetShouldSkipRepostFormConfirmation([aDecoder
125 decodeBoolForKey:web::kSessionEntrySkipRepostFormConfirmationKey]);
126 _navigationItem->SetIsOverridingUserAgent(
127 [aDecoder decodeBoolForKey:web::kSessionEntryUseDesktopUserAgentKey]);
128 _navigationItem->SetPostData(
129 [aDecoder decodeObjectForKey:web::kSessionEntryPOSTDataKey]);
130 _navigationItem->AddHttpRequestHeaders(
131 [aDecoder decodeObjectForKey:web::kSessionEntryHTTPRequestHeadersKey]);
132 }
133 return self;
134 }
135
136 - (void)encodeWithCoder:(NSCoder*)aCoder {
137 // Desktop Chrome doesn't persist |url_| or |originalUrl_|, only
138 // |virtualUrl_|.
139 web::nscoder_util::EncodeString(aCoder, web::kSessionEntryURLKey,
140 _navigationItem->GetVirtualURL().spec());
141 web::nscoder_util::EncodeString(aCoder, web::kSessionEntryReferrerURLKey,
142 _navigationItem->GetReferrer().url.spec());
143 [aCoder encodeInt:_navigationItem->GetReferrer().policy
144 forKey:web::kSessionEntryReferrerPolicyKey];
145 [aCoder encodeInt64:_navigationItem->GetTimestamp().ToInternalValue()
146 forKey:web::kSessionEntryTimestampKey];
147
148 [aCoder encodeObject:base::SysUTF16ToNSString(_navigationItem->GetTitle())
149 forKey:web::kSessionEntryTitleKey];
150 [aCoder encodeObject:[[self class] dictionaryFromPageDisplayState:
151 _navigationItem->GetPageDisplayState()]
152 forKey:web::kSessionEntryPageScrollStateKey];
153 [aCoder encodeBool:_navigationItem->ShouldSkipRepostFormConfirmation()
154 forKey:web::kSessionEntrySkipRepostFormConfirmationKey];
155 [aCoder encodeBool:_navigationItem->IsOverridingUserAgent()
156 forKey:web::kSessionEntryUseDesktopUserAgentKey];
157 [aCoder encodeObject:_navigationItem->GetPostData()
158 forKey:web::kSessionEntryPOSTDataKey];
159 [aCoder encodeObject:_navigationItem->GetHttpRequestHeaders()
160 forKey:web::kSessionEntryHTTPRequestHeadersKey];
161 }
162
163 // TODO(ios): Shall we overwrite EqualTo:? 70 // TODO(ios): Shall we overwrite EqualTo:?
164 71
165 - (instancetype)copyWithZone:(NSZone*)zone { 72 - (instancetype)copyWithZone:(NSZone*)zone {
166 CRWSessionEntry* copy = [[[self class] alloc] init]; 73 CRWSessionEntry* copy = [[[self class] alloc] init];
167 copy->_navigationItem.reset( 74 copy->_navigationItem.reset(
168 new web::NavigationItemImpl(*_navigationItem.get())); 75 new web::NavigationItemImpl(*_navigationItem.get()));
169 return copy; 76 return copy;
170 } 77 }
171 78
172 - (NSString*)description { 79 - (NSString*)description {
(...skipping 13 matching lines...) Expand all
186 } 93 }
187 94
188 - (web::NavigationItem*)navigationItem { 95 - (web::NavigationItem*)navigationItem {
189 return _navigationItem.get(); 96 return _navigationItem.get();
190 } 97 }
191 98
192 - (web::NavigationItemImpl*)navigationItemImpl { 99 - (web::NavigationItemImpl*)navigationItemImpl {
193 return _navigationItem.get(); 100 return _navigationItem.get();
194 } 101 }
195 102
196 #pragma mark - Serialization helpers 103 #pragma mark -
197
198 + (web::PageDisplayState)pageDisplayStateFromDictionary:
199 (NSDictionary*)dictionary {
200 NSNumber* serializedValue = nil;
201 web::PageScrollState scrollState;
202 if ((serializedValue = dictionary[web::kSessionEntryScrollOffsetXKey]))
203 scrollState.set_offset_x([serializedValue doubleValue]);
204 if ((serializedValue = dictionary[web::kSessionEntryScrollOffsetYKey]))
205 scrollState.set_offset_y([serializedValue doubleValue]);
206 web::PageZoomState zoomState;
207 if ((serializedValue = dictionary[web::kSessionEntryMinimumZoomScaleKey]))
208 zoomState.set_minimum_zoom_scale([serializedValue doubleValue]);
209 if ((serializedValue = dictionary[web::kSessionEntryMaximumZoomScaleKey]))
210 zoomState.set_maximum_zoom_scale([serializedValue doubleValue]);
211 if ((serializedValue = dictionary[web::kSessionEntryZoomScaleKey]))
212 zoomState.set_zoom_scale([serializedValue doubleValue]);
213 return web::PageDisplayState(scrollState, zoomState);
214 }
215
216 + (NSDictionary*)dictionaryFromPageDisplayState:
217 (const web::PageDisplayState&)displayState {
218 return @{
219 web::kSessionEntryScrollOffsetXKey :
220 @(displayState.scroll_state().offset_x()),
221 web::kSessionEntryScrollOffsetYKey :
222 @(displayState.scroll_state().offset_y()),
223 web::kSessionEntryMinimumZoomScaleKey :
224 @(displayState.zoom_state().minimum_zoom_scale()),
225 web::kSessionEntryMaximumZoomScaleKey :
226 @(displayState.zoom_state().maximum_zoom_scale()),
227 web::kSessionEntryZoomScaleKey :
228 @(displayState.zoom_state().zoom_scale())
229 };
230 }
231 104
232 + (NSString*)descriptionForPageDisplayState: 105 + (NSString*)descriptionForPageDisplayState:
233 (const web::PageDisplayState&)displayState { 106 (const web::PageDisplayState&)displayState {
234 NSString* const kPageScrollStateDescriptionFormat = 107 NSString* const kPageScrollStateDescriptionFormat =
235 @"{ scrollOffset:(%0.2f, %0.2f), zoomScaleRange:(%0.2f, %0.2f), " 108 @"{ scrollOffset:(%0.2f, %0.2f), zoomScaleRange:(%0.2f, %0.2f), "
236 @"zoomScale:%0.2f }"; 109 @"zoomScale:%0.2f }";
237 return 110 return
238 [NSString stringWithFormat:kPageScrollStateDescriptionFormat, 111 [NSString stringWithFormat:kPageScrollStateDescriptionFormat,
239 displayState.scroll_state().offset_x(), 112 displayState.scroll_state().offset_x(),
240 displayState.scroll_state().offset_y(), 113 displayState.scroll_state().offset_y(),
241 displayState.zoom_state().minimum_zoom_scale(), 114 displayState.zoom_state().minimum_zoom_scale(),
242 displayState.zoom_state().maximum_zoom_scale(), 115 displayState.zoom_state().maximum_zoom_scale(),
243 displayState.zoom_state().zoom_scale()]; 116 displayState.zoom_state().zoom_scale()];
244 } 117 }
245 118
246 @end 119 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698