Index: ios/web/web_state/ui/crw_web_controller.mm |
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm |
index 851a9adc829b388ffb0c268ddec85557beae80aa..2a81185a79e414b8f563ba4e5daeff76bac26eb7 100644 |
--- a/ios/web/web_state/ui/crw_web_controller.mm |
+++ b/ios/web/web_state/ui/crw_web_controller.mm |
@@ -258,6 +258,11 @@ void CancelTouches(UIGestureRecognizer* gesture_recognizer) { |
// if the next load request is for that URL, it should be treated as a |
// reconstruction that should use cache aggressively. |
GURL _expectedReconstructionURL; |
+ // Whether the web page is currently performing window.history.pushState or |
+ // window.history.replaceState |
+ // Set to YES on window.history.willChangeState message. To NO on |
+ // window.history.didPushState or window.history.didReplaceState. |
+ BOOL _changingHistoryState; |
scoped_ptr<web::NewWindowInfo> _externalRequest; |
@@ -1899,6 +1904,10 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
return _isHalted; |
} |
+- (BOOL)changingHistoryState { |
+ return _changingHistoryState; |
+} |
+ |
- (web::ReferrerPolicy)referrerPolicyFromString:(const std::string&)policy { |
// TODO(stuartmorgan): Remove this temporary bridge to the helper function |
// once the referrer handling moves into the subclasses. |
@@ -2397,22 +2406,15 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
- (BOOL)handleWindowHistoryWillChangeStateMessage:(base::DictionaryValue*)unused |
context:(NSDictionary*)unusedContext { |
- // This dummy handler is a workaround for crbug.com/490673. Issue was |
- // happening when two sequential calls of window.history.pushState were |
- // performed by the page. In that case state was changed twice before |
- // first change was reported to embedder (and first URL change was reported |
- // incorrectly). |
- |
- // Using dummy handler for window.history.willChangeState message holds |
- // second state change until the first change is reported, because messages |
- // are queued. This is essentially a sleep, and not the real fix of the |
- // problem. TODO(eugenebut): refactor handleWindowHistoryDidPushStateMessage: |
- // to avoid this "sleep". |
+ _changingHistoryState = YES; |
return YES; |
} |
- (BOOL)handleWindowHistoryDidPushStateMessage:(base::DictionaryValue*)message |
context:(NSDictionary*)context { |
+ DCHECK(_changingHistoryState); |
+ _changingHistoryState = NO; |
+ |
// If there is a pending entry, a new navigation has been registered but |
// hasn't begun loading. Since the pushState message is coming from the |
// previous page, ignore it and allow the previously registered navigation to |
@@ -2494,6 +2496,9 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
- (BOOL)handleWindowHistoryDidReplaceStateMessage: |
(base::DictionaryValue*)message |
context:(NSDictionary*)context { |
+ DCHECK(_changingHistoryState); |
+ _changingHistoryState = NO; |
+ |
std::string pageURL; |
std::string baseURL; |
if (!message->GetString("pageUrl", &pageURL) || |