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

Side by Side Diff: third_party/WebKit/Source/core/loader/FrameLoader.cpp

Issue 2487403002: Allow navigations to frames that aren't being unloaded in the unload handler. (Closed)
Patch Set: fix test Created 4 years 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 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights
3 * reserved. 3 * reserved.
4 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 4 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
5 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. 5 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved.
6 * (http://www.torchmobile.com/) 6 * (http://www.torchmobile.com/)
7 * Copyright (C) 2008 Alp Toker <alp@atoker.com> 7 * Copyright (C) 2008 Alp Toker <alp@atoker.com>
8 * Copyright (C) Research In Motion Limited 2009. All rights reserved. 8 * Copyright (C) Research In Motion Limited 2009. All rights reserved.
9 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com> 9 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com>
10 * Copyright (C) 2011 Google Inc. All rights reserved. 10 * Copyright (C) 2011 Google Inc. All rights reserved.
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 m_currentItem->setVisualViewportScrollOffset(toScrollOffset( 280 m_currentItem->setVisualViewportScrollOffset(toScrollOffset(
281 m_frame->host()->visualViewport().visibleRect().location())); 281 m_frame->host()->visualViewport().visibleRect().location()));
282 282
283 if (m_frame->isMainFrame()) 283 if (m_frame->isMainFrame())
284 m_currentItem->setPageScaleFactor(m_frame->page()->pageScaleFactor()); 284 m_currentItem->setPageScaleFactor(m_frame->page()->pageScaleFactor());
285 285
286 client()->didUpdateCurrentHistoryItem(); 286 client()->didUpdateCurrentHistoryItem();
287 } 287 }
288 288
289 void FrameLoader::dispatchUnloadEvent() { 289 void FrameLoader::dispatchUnloadEvent() {
290 NavigationDisablerForUnload navigationDisabler; 290 FrameNavigationDisabler navigationDisabler(*m_frame);
291 291
292 // If the frame is unloading, the provisional loader should no longer be 292 // If the frame is unloading, the provisional loader should no longer be
293 // protected. It will be detached soon. 293 // protected. It will be detached soon.
294 m_protectProvisionalLoader = false; 294 m_protectProvisionalLoader = false;
295 saveScrollState(); 295 saveScrollState();
296 296
297 if (m_frame->document() && !SVGImage::isInSVGImage(m_frame->document())) 297 if (m_frame->document() && !SVGImage::isInSVGImage(m_frame->document()))
298 m_frame->document()->dispatchUnloadEvents(); 298 m_frame->document()->dispatchUnloadEvents();
299 } 299 }
300 300
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after
1086 } 1086 }
1087 return policy; 1087 return policy;
1088 } 1088 }
1089 1089
1090 void FrameLoader::load(const FrameLoadRequest& passedRequest, 1090 void FrameLoader::load(const FrameLoadRequest& passedRequest,
1091 FrameLoadType frameLoadType, 1091 FrameLoadType frameLoadType,
1092 HistoryItem* historyItem, 1092 HistoryItem* historyItem,
1093 HistoryLoadType historyLoadType) { 1093 HistoryLoadType historyLoadType) {
1094 DCHECK(m_frame->document()); 1094 DCHECK(m_frame->document());
1095 1095
1096 if (!m_frame->isNavigationAllowed())
1097 return;
1098
1099 if (m_inStopAllLoaders) 1096 if (m_inStopAllLoaders)
1100 return; 1097 return;
1101 1098
1102 if (m_frame->page()->suspended() && isBackForwardLoadType(frameLoadType)) { 1099 if (m_frame->page()->suspended() && isBackForwardLoadType(frameLoadType)) {
1103 m_deferredHistoryLoad = DeferredHistoryLoad::create( 1100 m_deferredHistoryLoad = DeferredHistoryLoad::create(
1104 passedRequest.resourceRequest(), historyItem, frameLoadType, 1101 passedRequest.resourceRequest(), historyItem, frameLoadType,
1105 historyLoadType); 1102 historyLoadType);
1106 return; 1103 return;
1107 } 1104 }
1108 1105
1109 FrameLoadRequest request(passedRequest); 1106 FrameLoadRequest request(passedRequest);
1110 request.resourceRequest().setHasUserGesture( 1107 request.resourceRequest().setHasUserGesture(
1111 UserGestureIndicator::processingUserGesture()); 1108 UserGestureIndicator::processingUserGesture());
1112 1109
1113 if (!prepareRequestForThisFrame(request)) 1110 if (!prepareRequestForThisFrame(request))
1114 return; 1111 return;
1115 1112
1116 if (isBackForwardLoadType(frameLoadType)) { 1113 if (isBackForwardLoadType(frameLoadType)) {
1117 DCHECK(historyItem); 1114 DCHECK(historyItem);
1118 m_provisionalItem = historyItem; 1115 m_provisionalItem = historyItem;
1119 } 1116 }
1120 1117
1121 // Form submissions appear to need their special-case of finding the target at 1118 // Form submissions appear to need their special-case of finding the target at
1122 // schedule rather than at fire. 1119 // schedule rather than at fire.
1123 Frame* targetFrame = request.form() 1120 Frame* targetFrame = request.form()
1124 ? nullptr 1121 ? nullptr
1125 : m_frame->findFrameForNavigation( 1122 : m_frame->findFrameForNavigation(
1126 AtomicString(request.frameName()), *m_frame); 1123 AtomicString(request.frameName()), *m_frame);
1124
1125 if (targetFrame && targetFrame->isLocalFrame() &&
1126 !toLocalFrame(targetFrame)->isNavigationAllowed()) {
1127 return;
1128 }
1129
1127 NavigationPolicy policy = navigationPolicyForRequest(request); 1130 NavigationPolicy policy = navigationPolicyForRequest(request);
1128 if (targetFrame && targetFrame != m_frame && 1131 if (targetFrame && targetFrame != m_frame &&
1129 shouldNavigateTargetFrame(policy)) { 1132 shouldNavigateTargetFrame(policy)) {
1130 bool wasInSamePage = targetFrame->page() == m_frame->page(); 1133 bool wasInSamePage = targetFrame->page() == m_frame->page();
1131 1134
1132 request.setFrameName("_self"); 1135 request.setFrameName("_self");
1133 targetFrame->navigate(request); 1136 targetFrame->navigate(request);
1134 Page* page = targetFrame->page(); 1137 Page* page = targetFrame->page();
1135 if (!wasInSamePage && page) 1138 if (!wasInSamePage && page)
1136 page->chromeClient().focus(); 1139 page->chromeClient().focus();
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
1552 for (Frame* child = m_frame->tree().firstChild(); child; 1555 for (Frame* child = m_frame->tree().firstChild(); child;
1553 child = child->tree().traverseNext(m_frame)) { 1556 child = child->tree().traverseNext(m_frame)) {
1554 // FIXME: There is not yet any way to dispatch events to out-of-process 1557 // FIXME: There is not yet any way to dispatch events to out-of-process
1555 // frames. 1558 // frames.
1556 if (child->isLocalFrame()) 1559 if (child->isLocalFrame())
1557 targetFrames.append(toLocalFrame(child)); 1560 targetFrames.append(toLocalFrame(child));
1558 } 1561 }
1559 1562
1560 bool shouldClose = false; 1563 bool shouldClose = false;
1561 { 1564 {
1562 NavigationDisablerForUnload navigationDisabler; 1565 NavigationDisablerForBeforeUnload navigationDisabler;
1563 size_t i; 1566 size_t i;
1564 1567
1565 bool didAllowNavigation = false; 1568 bool didAllowNavigation = false;
1566 for (i = 0; i < targetFrames.size(); i++) { 1569 for (i = 0; i < targetFrames.size(); i++) {
1567 if (!targetFrames[i]->tree().isDescendantOf(m_frame)) 1570 if (!targetFrames[i]->tree().isDescendantOf(m_frame))
1568 continue; 1571 continue;
1569 if (!targetFrames[i]->document()->dispatchBeforeUnloadEvent( 1572 if (!targetFrames[i]->document()->dispatchBeforeUnloadEvent(
1570 page->chromeClient(), isReload, didAllowNavigation)) 1573 page->chromeClient(), isReload, didAllowNavigation))
1571 break; 1574 break;
1572 } 1575 }
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
1957 m_documentLoader ? m_documentLoader->url() : String()); 1960 m_documentLoader ? m_documentLoader->url() : String());
1958 return tracedValue; 1961 return tracedValue;
1959 } 1962 }
1960 1963
1961 inline void FrameLoader::takeObjectSnapshot() const { 1964 inline void FrameLoader::takeObjectSnapshot() const {
1962 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID("loading", "FrameLoader", this, 1965 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID("loading", "FrameLoader", this,
1963 toTracedValue()); 1966 toTracedValue());
1964 } 1967 }
1965 1968
1966 } // namespace blink 1969 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698