OLD | NEW |
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_controller.h" | 5 #import "ios/web/navigation/crw_session_controller.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <utility> | 10 #include <utility> |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 // displayed tab is. It backs the property of the same name and should only | 52 // displayed tab is. It backs the property of the same name and should only |
53 // be set through its setter. | 53 // be set through its setter. |
54 base::scoped_nsobject<CRWSessionEntry> _pendingEntry; | 54 base::scoped_nsobject<CRWSessionEntry> _pendingEntry; |
55 | 55 |
56 // The transient entry, if any. A transient entry is discarded on any | 56 // The transient entry, if any. A transient entry is discarded on any |
57 // navigation, and is used for representing interstitials that need to be | 57 // navigation, and is used for representing interstitials that need to be |
58 // represented in the session. It backs the property of the same name and | 58 // represented in the session. It backs the property of the same name and |
59 // should only be set through its setter. | 59 // should only be set through its setter. |
60 base::scoped_nsobject<CRWSessionEntry> _transientEntry; | 60 base::scoped_nsobject<CRWSessionEntry> _transientEntry; |
61 | 61 |
62 // The window name associated with the session. | |
63 NSString* _windowName; | |
64 | |
65 // Stores the certificate policies decided by the user. | 62 // Stores the certificate policies decided by the user. |
66 CRWSessionCertificatePolicyManager* _sessionCertificatePolicyManager; | 63 CRWSessionCertificatePolicyManager* _sessionCertificatePolicyManager; |
67 | 64 |
68 // The timestamp of the last time this tab is visited, represented in time | 65 // The timestamp of the last time this tab is visited, represented in time |
69 // interval since 1970. | 66 // interval since 1970. |
70 NSTimeInterval _lastVisitedTimestamp; | 67 NSTimeInterval _lastVisitedTimestamp; |
71 | 68 |
72 // The browser state associated with this CRWSessionController; | 69 // The browser state associated with this CRWSessionController; |
73 web::BrowserState* _browserState; // weak | 70 web::BrowserState* _browserState; // weak |
74 | 71 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 // Returns a NavigationItemList containing the NavigationItems from |entries|. | 105 // Returns a NavigationItemList containing the NavigationItems from |entries|. |
109 - (web::NavigationItemList)itemListForEntryList:(NSArray*)entries; | 106 - (web::NavigationItemList)itemListForEntryList:(NSArray*)entries; |
110 @end | 107 @end |
111 | 108 |
112 @implementation CRWSessionController | 109 @implementation CRWSessionController |
113 | 110 |
114 @synthesize currentNavigationIndex = _currentNavigationIndex; | 111 @synthesize currentNavigationIndex = _currentNavigationIndex; |
115 @synthesize previousNavigationIndex = _previousNavigationIndex; | 112 @synthesize previousNavigationIndex = _previousNavigationIndex; |
116 @synthesize pendingItemIndex = _pendingItemIndex; | 113 @synthesize pendingItemIndex = _pendingItemIndex; |
117 @synthesize entries = _entries; | 114 @synthesize entries = _entries; |
118 @synthesize windowName = _windowName; | |
119 @synthesize lastVisitedTimestamp = _lastVisitedTimestamp; | 115 @synthesize lastVisitedTimestamp = _lastVisitedTimestamp; |
120 @synthesize openedByDOM = _openedByDOM; | 116 @synthesize openedByDOM = _openedByDOM; |
121 @synthesize sessionCertificatePolicyManager = _sessionCertificatePolicyManager; | 117 @synthesize sessionCertificatePolicyManager = _sessionCertificatePolicyManager; |
122 | 118 |
123 - (instancetype)initWithWindowName:(NSString*)windowName | 119 - (instancetype)initWithBrowserState:(web::BrowserState*)browserState |
124 openedByDOM:(BOOL)openedByDOM | 120 openedByDOM:(BOOL)openedByDOM { |
125 browserState:(web::BrowserState*)browserState { | |
126 self = [super init]; | 121 self = [super init]; |
127 if (self) { | 122 if (self) { |
128 self.windowName = windowName; | |
129 _openedByDOM = openedByDOM; | 123 _openedByDOM = openedByDOM; |
130 _browserState = browserState; | 124 _browserState = browserState; |
131 _entries = [NSMutableArray array]; | 125 _entries = [NSMutableArray array]; |
132 _lastVisitedTimestamp = [[NSDate date] timeIntervalSince1970]; | 126 _lastVisitedTimestamp = [[NSDate date] timeIntervalSince1970]; |
133 _currentNavigationIndex = -1; | 127 _currentNavigationIndex = -1; |
134 _previousNavigationIndex = -1; | 128 _previousNavigationIndex = -1; |
135 _pendingItemIndex = -1; | 129 _pendingItemIndex = -1; |
136 _sessionCertificatePolicyManager = | 130 _sessionCertificatePolicyManager = |
137 [[CRWSessionCertificatePolicyManager alloc] init]; | 131 [[CRWSessionCertificatePolicyManager alloc] init]; |
138 } | 132 } |
139 return self; | 133 return self; |
140 } | 134 } |
141 | 135 |
142 - (instancetype)initWithNavigationItems: | 136 - (instancetype)initWithBrowserState:(web::BrowserState*)browserState |
143 (std::vector<std::unique_ptr<web::NavigationItem>>)items | 137 navigationItems:(web::ScopedNavigationItemList)items |
144 currentIndex:(NSUInteger)currentIndex | 138 currentIndex:(NSUInteger)currentIndex { |
145 browserState:(web::BrowserState*)browserState { | |
146 self = [super init]; | 139 self = [super init]; |
147 if (self) { | 140 if (self) { |
148 _browserState = browserState; | 141 _browserState = browserState; |
149 | 142 |
150 // Create entries array from list of navigations. | 143 // Create entries array from list of navigations. |
151 _entries = [[NSMutableArray alloc] initWithCapacity:items.size()]; | 144 _entries = [[NSMutableArray alloc] initWithCapacity:items.size()]; |
152 | |
153 for (auto& item : items) { | 145 for (auto& item : items) { |
154 base::scoped_nsobject<CRWSessionEntry> entry( | 146 base::scoped_nsobject<CRWSessionEntry> entry( |
155 [[CRWSessionEntry alloc] initWithNavigationItem:std::move(item)]); | 147 [[CRWSessionEntry alloc] initWithNavigationItem:std::move(item)]); |
156 [_entries addObject:entry]; | 148 [_entries addObject:entry]; |
157 } | 149 } |
158 self.currentNavigationIndex = currentIndex; | 150 self.currentNavigationIndex = currentIndex; |
159 // Prior to M34, 0 was used as "no index" instead of -1; adjust for that. | 151 // Prior to M34, 0 was used as "no index" instead of -1; adjust for that. |
160 if (![_entries count]) | 152 if (![_entries count]) |
161 self.currentNavigationIndex = -1; | 153 self.currentNavigationIndex = -1; |
162 if (_currentNavigationIndex >= static_cast<NSInteger>(items.size())) { | 154 if (_currentNavigationIndex >= static_cast<NSInteger>(items.size())) { |
163 self.currentNavigationIndex = static_cast<NSInteger>(items.size()) - 1; | 155 self.currentNavigationIndex = static_cast<NSInteger>(items.size()) - 1; |
164 } | 156 } |
165 _previousNavigationIndex = -1; | 157 _previousNavigationIndex = -1; |
166 _pendingItemIndex = -1; | 158 _pendingItemIndex = -1; |
167 _lastVisitedTimestamp = [[NSDate date] timeIntervalSince1970]; | 159 _lastVisitedTimestamp = [[NSDate date] timeIntervalSince1970]; |
168 _sessionCertificatePolicyManager = | 160 _sessionCertificatePolicyManager = |
169 [[CRWSessionCertificatePolicyManager alloc] init]; | 161 [[CRWSessionCertificatePolicyManager alloc] init]; |
170 } | 162 } |
171 return self; | 163 return self; |
172 } | 164 } |
173 | 165 |
174 - (id)copyWithZone:(NSZone*)zone { | 166 - (id)copyWithZone:(NSZone*)zone { |
175 CRWSessionController* copy = [[[self class] alloc] init]; | 167 CRWSessionController* copy = [[[self class] alloc] init]; |
176 copy->_openedByDOM = _openedByDOM; | 168 copy->_openedByDOM = _openedByDOM; |
177 copy.windowName = self.windowName; | |
178 copy->_currentNavigationIndex = _currentNavigationIndex; | 169 copy->_currentNavigationIndex = _currentNavigationIndex; |
179 copy->_previousNavigationIndex = _previousNavigationIndex; | 170 copy->_previousNavigationIndex = _previousNavigationIndex; |
180 copy->_pendingItemIndex = _pendingItemIndex; | 171 copy->_pendingItemIndex = _pendingItemIndex; |
181 copy->_lastVisitedTimestamp = _lastVisitedTimestamp; | 172 copy->_lastVisitedTimestamp = _lastVisitedTimestamp; |
182 copy->_entries = | 173 copy->_entries = |
183 [[NSMutableArray alloc] initWithArray:_entries copyItems:YES]; | 174 [[NSMutableArray alloc] initWithArray:_entries copyItems:YES]; |
184 copy->_sessionCertificatePolicyManager = | 175 copy->_sessionCertificatePolicyManager = |
185 [_sessionCertificatePolicyManager copy]; | 176 [_sessionCertificatePolicyManager copy]; |
186 return copy; | 177 return copy; |
187 } | 178 } |
(...skipping 29 matching lines...) Expand all Loading... |
217 } | 208 } |
218 | 209 |
219 - (void)setBrowserState:(web::BrowserState*)browserState { | 210 - (void)setBrowserState:(web::BrowserState*)browserState { |
220 _browserState = browserState; | 211 _browserState = browserState; |
221 DCHECK(!_navigationManager || | 212 DCHECK(!_navigationManager || |
222 _navigationManager->GetBrowserState() == _browserState); | 213 _navigationManager->GetBrowserState() == _browserState); |
223 } | 214 } |
224 | 215 |
225 - (NSString*)description { | 216 - (NSString*)description { |
226 return [NSString | 217 return [NSString |
227 stringWithFormat:@"name: %@\nlast visit: %f\ncurrent index: %" PRIdNS | 218 stringWithFormat:@"last visit: %f\ncurrent index: %" PRIdNS |
228 @"\nprevious index: %" PRIdNS | 219 @"\nprevious index: %" PRIdNS |
229 @"\npending index: %" PRIdNS | 220 @"\npending index: %" PRIdNS |
230 @"\n%@\npending: %@\ntransient: %@\n", | 221 @"\n%@\npending: %@\ntransient: %@\n", |
231 self.windowName, _lastVisitedTimestamp, | 222 _lastVisitedTimestamp, _currentNavigationIndex, |
232 _currentNavigationIndex, _previousNavigationIndex, | 223 _previousNavigationIndex, _pendingItemIndex, _entries, |
233 _pendingItemIndex, _entries, _pendingEntry.get(), | 224 _pendingEntry.get(), _transientEntry.get()]; |
234 _transientEntry.get()]; | |
235 } | 225 } |
236 | 226 |
237 - (web::NavigationItemList)items { | 227 - (web::NavigationItemList)items { |
238 return [self itemListForEntryList:self.entries]; | 228 return [self itemListForEntryList:self.entries]; |
239 } | 229 } |
240 | 230 |
241 - (web::NavigationItemImpl*)currentItem { | 231 - (web::NavigationItemImpl*)currentItem { |
242 return self.currentEntry.navigationItemImpl; | 232 return self.currentEntry.navigationItemImpl; |
243 } | 233 } |
244 | 234 |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 // Keep the entry alive temporarily. There are flows that get the current | 522 // Keep the entry alive temporarily. There are flows that get the current |
533 // entry, do some navigation operation, and then try to use that old current | 523 // entry, do some navigation operation, and then try to use that old current |
534 // entry; since navigations clear the transient entry, these flows might | 524 // entry; since navigations clear the transient entry, these flows might |
535 // crash. (This should be removable once more session management is handled | 525 // crash. (This should be removable once more session management is handled |
536 // within this class and/or NavigationManager). | 526 // within this class and/or NavigationManager). |
537 _transientEntry.reset(); | 527 _transientEntry.reset(); |
538 } | 528 } |
539 | 529 |
540 - (void)insertStateFromSessionController:(CRWSessionController*)sourceSession { | 530 - (void)insertStateFromSessionController:(CRWSessionController*)sourceSession { |
541 DCHECK(sourceSession); | 531 DCHECK(sourceSession); |
542 self.windowName = sourceSession.windowName; | |
543 | |
544 // The other session may not have any entries, in which case there is nothing | 532 // The other session may not have any entries, in which case there is nothing |
545 // to insert. The other session's currentNavigationEntry will be bogus | 533 // to insert. The other session's currentNavigationEntry will be bogus |
546 // in such cases, so ignore it and return early. | 534 // in such cases, so ignore it and return early. |
547 NSArray* sourceEntries = sourceSession.entries; | 535 NSArray* sourceEntries = sourceSession.entries; |
548 if (!sourceEntries.count) | 536 if (!sourceEntries.count) |
549 return; | 537 return; |
550 | 538 |
551 // Cycle through the entries from the other session and insert them before any | 539 // Cycle through the entries from the other session and insert them before any |
552 // entries from this session. Do not copy anything that comes after the other | 540 // entries from this session. Do not copy anything that comes after the other |
553 // session's current entry. | 541 // session's current entry. |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
708 } | 696 } |
709 | 697 |
710 - (web::NavigationItemList)itemListForEntryList:(NSArray*)entries { | 698 - (web::NavigationItemList)itemListForEntryList:(NSArray*)entries { |
711 web::NavigationItemList list(entries.count); | 699 web::NavigationItemList list(entries.count); |
712 for (size_t index = 0; index < entries.count; ++index) | 700 for (size_t index = 0; index < entries.count; ++index) |
713 list[index] = [entries[index] navigationItem]; | 701 list[index] = [entries[index] navigationItem]; |
714 return list; | 702 return list; |
715 } | 703 } |
716 | 704 |
717 @end | 705 @end |
OLD | NEW |