OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed. | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed. |
3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
4 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) | 4 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) |
5 * Copyright (C) 2008 Alp Toker <alp@atoker.com> | 5 * Copyright (C) 2008 Alp Toker <alp@atoker.com> |
6 * Copyright (C) Research In Motion Limited 2009. All rights reserved. | 6 * Copyright (C) Research In Motion Limited 2009. All rights reserved. |
7 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com> | 7 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com> |
8 * Copyright (C) 2011 Google Inc. All rights reserved. | 8 * Copyright (C) 2011 Google Inc. All rights reserved. |
9 * | 9 * |
10 * Redistribution and use in source and binary forms, with or without | 10 * Redistribution and use in source and binary forms, with or without |
(...skipping 702 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
713 loader->detachFromFrame(); | 713 loader->detachFromFrame(); |
714 loader = nullptr; | 714 loader = nullptr; |
715 } | 715 } |
716 | 716 |
717 void FrameLoader::loadInSameDocument(const KURL& url, PassRefPtr<SerializedScrip tValue> stateObject, FrameLoadType frameLoadType, HistoryLoadType historyLoadTyp e, ClientRedirectPolicy clientRedirect) | 717 void FrameLoader::loadInSameDocument(const KURL& url, PassRefPtr<SerializedScrip tValue> stateObject, FrameLoadType frameLoadType, HistoryLoadType historyLoadTyp e, ClientRedirectPolicy clientRedirect) |
718 { | 718 { |
719 // If we have a state object, we cannot also be a new navigation. | 719 // If we have a state object, we cannot also be a new navigation. |
720 ASSERT(!stateObject || frameLoadType == FrameLoadTypeBackForward); | 720 ASSERT(!stateObject || frameLoadType == FrameLoadTypeBackForward); |
721 | 721 |
722 // If we have a provisional request for a different document, a fragment scr oll should cancel it. | 722 // If we have a provisional request for a different document, a fragment scr oll should cancel it. |
723 if (m_provisionalDocumentLoader) { | 723 detachDocumentLoader(m_provisionalDocumentLoader); |
724 m_provisionalDocumentLoader->stopLoading(); | 724 if (!m_frame->host()) |
725 detachDocumentLoader(m_provisionalDocumentLoader); | 725 return; |
726 if (!m_frame->host()) | |
727 return; | |
728 } | |
729 TemporaryChange<FrameLoadType> loadTypeChange(m_loadType, frameLoadType); | 726 TemporaryChange<FrameLoadType> loadTypeChange(m_loadType, frameLoadType); |
730 saveScrollState(); | 727 saveScrollState(); |
731 | 728 |
732 KURL oldURL = m_frame->document()->url(); | 729 KURL oldURL = m_frame->document()->url(); |
733 bool hashChange = equalIgnoringFragmentIdentifier(url, oldURL) && url.fragme ntIdentifier() != oldURL.fragmentIdentifier(); | 730 bool hashChange = equalIgnoringFragmentIdentifier(url, oldURL) && url.fragme ntIdentifier() != oldURL.fragmentIdentifier(); |
734 if (hashChange) { | 731 if (hashChange) { |
735 // If we were in the autoscroll/panScroll mode we want to stop it before following the link to the anchor | 732 // If we were in the autoscroll/panScroll mode we want to stop it before following the link to the anchor |
736 m_frame->eventHandler().stopAutoscroll(); | 733 m_frame->eventHandler().stopAutoscroll(); |
737 m_frame->localDOMWindow()->enqueueHashchangeEvent(oldURL, url); | 734 m_frame->localDOMWindow()->enqueueHashchangeEvent(oldURL, url); |
738 } | 735 } |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
998 | 995 |
999 void FrameLoader::stopAllLoaders() | 996 void FrameLoader::stopAllLoaders() |
1000 { | 997 { |
1001 if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::No Dismissal) | 998 if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::No Dismissal) |
1002 return; | 999 return; |
1003 | 1000 |
1004 // If this method is called from within this method, infinite recursion can occur (3442218). Avoid this. | 1001 // If this method is called from within this method, infinite recursion can occur (3442218). Avoid this. |
1005 if (m_inStopAllLoaders) | 1002 if (m_inStopAllLoaders) |
1006 return; | 1003 return; |
1007 | 1004 |
1008 // Calling stopLoading() on the provisional document loader can blow away | 1005 // Stopping a document loader can blow away the frame from underneath. |
1009 // the frame from underneath. | |
1010 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); | 1006 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); |
1011 | 1007 |
1012 m_inStopAllLoaders = true; | 1008 m_inStopAllLoaders = true; |
1013 | 1009 |
1014 for (RefPtrWillBeRawPtr<Frame> child = m_frame->tree().firstChild(); child; child = child->tree().nextSibling()) { | 1010 for (RefPtrWillBeRawPtr<Frame> child = m_frame->tree().firstChild(); child; child = child->tree().nextSibling()) { |
1015 if (child->isLocalFrame()) | 1011 if (child->isLocalFrame()) |
1016 toLocalFrame(child.get())->loader().stopAllLoaders(); | 1012 toLocalFrame(child.get())->loader().stopAllLoaders(); |
1017 } | 1013 } |
1018 | 1014 |
1019 m_frame->document()->suppressLoadEvent(); | 1015 m_frame->document()->suppressLoadEvent(); |
1020 // Don't stop loading the provisional loader if it is being protected (i.e. | |
1021 // it is about to be committed) See prepareForCommit() for more details. | |
1022 if (m_provisionalDocumentLoader && !m_protectProvisionalLoader) | |
1023 m_provisionalDocumentLoader->stopLoading(); | |
1024 if (m_documentLoader) | 1016 if (m_documentLoader) |
1025 m_documentLoader->stopLoading(); | 1017 m_documentLoader->fetcher()->stopFetching(); |
1026 m_frame->document()->cancelParsing(); | 1018 m_frame->document()->cancelParsing(); |
1027 | |
1028 if (!m_protectProvisionalLoader) | 1019 if (!m_protectProvisionalLoader) |
1029 detachDocumentLoader(m_provisionalDocumentLoader); | 1020 detachDocumentLoader(m_provisionalDocumentLoader); |
1030 | 1021 |
1031 m_checkTimer.stop(); | 1022 m_checkTimer.stop(); |
1032 m_frame->navigationScheduler().cancel(); | 1023 m_frame->navigationScheduler().cancel(); |
1033 | 1024 |
1025 // It's possible that the above actions won't have stopped loading if load | |
1026 // completion had been blocked on parsing or if we were in the middle of | |
1027 // committing an empty document. In that case, emulate a failed navigation. | |
1028 if (!m_provisionalDocumentLoader && m_documentLoader && m_frame->isLoading() ) | |
1029 loadFailed(!m_documentLoader->sentDidFinishLoad() ? m_documentLoader.get () : nullptr, ResourceError::cancelledError(m_documentLoader->url())); | |
Nate Chapin
2016/03/22 16:42:43
Unconditionally use m_documentLoader. It's probabl
| |
1030 | |
1034 m_inStopAllLoaders = false; | 1031 m_inStopAllLoaders = false; |
1035 } | 1032 } |
1036 | 1033 |
1037 void FrameLoader::didAccessInitialDocument() | 1034 void FrameLoader::didAccessInitialDocument() |
1038 { | 1035 { |
1039 // We only need to notify the client once, and only for the main frame. | 1036 // We only need to notify the client once, and only for the main frame. |
1040 if (isLoadingMainFrame() && !m_didAccessInitialDocument) { | 1037 if (isLoadingMainFrame() && !m_didAccessInitialDocument) { |
1041 m_didAccessInitialDocument = true; | 1038 m_didAccessInitialDocument = true; |
1042 // Notify asynchronously, since this is called within a JavaScript secur ity check. | 1039 // Notify asynchronously, since this is called within a JavaScript secur ity check. |
1043 m_didAccessInitialDocumentTimer.startOneShot(0, BLINK_FROM_HERE); | 1040 m_didAccessInitialDocumentTimer.startOneShot(0, BLINK_FROM_HERE); |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1235 | 1232 |
1236 Frame* parent = m_frame->tree().parent(); | 1233 Frame* parent = m_frame->tree().parent(); |
1237 if (parent && parent->isLocalFrame()) | 1234 if (parent && parent->isLocalFrame()) |
1238 toLocalFrame(parent)->loader().scheduleCheckCompleted(); | 1235 toLocalFrame(parent)->loader().scheduleCheckCompleted(); |
1239 if (m_progressTracker) { | 1236 if (m_progressTracker) { |
1240 m_progressTracker->dispose(); | 1237 m_progressTracker->dispose(); |
1241 m_progressTracker.clear(); | 1238 m_progressTracker.clear(); |
1242 } | 1239 } |
1243 } | 1240 } |
1244 | 1241 |
1245 void FrameLoader::receivedMainResourceError(DocumentLoader* loader, const Resour ceError& error) | 1242 void FrameLoader::loadFailed(DocumentLoader* loader, const ResourceError& error) |
1246 { | 1243 { |
1247 // Retain because the stop may release the last reference to it. | 1244 // Retain because the stop may release the last reference to it. |
1248 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); | 1245 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); |
1249 RefPtrWillBeRawPtr<DocumentLoader> protectDocumentLoader(loader); | 1246 RefPtrWillBeRawPtr<DocumentLoader> protectDocumentLoader(loader); |
1250 | 1247 |
1251 // FIXME: We really ought to be able to just check for isCancellation() here , but there are some | 1248 if (!error.isCancellation() && m_frame->owner()) { |
1252 // ResourceErrors that setIsCancellation() but aren't created by ResourceErr or::cancelledError(). | |
1253 ResourceError c(ResourceError::cancelledError(KURL())); | |
1254 if ((error.errorCode() != c.errorCode() || error.domain() != c.domain()) && m_frame->owner()) { | |
1255 // FIXME: For now, fallback content doesn't work cross process. | 1249 // FIXME: For now, fallback content doesn't work cross process. |
1256 if (m_frame->owner()->isLocal()) | 1250 if (m_frame->owner()->isLocal()) |
1257 m_frame->deprecatedLocalOwner()->renderFallbackContent(); | 1251 m_frame->deprecatedLocalOwner()->renderFallbackContent(); |
1258 } | 1252 } |
1259 | 1253 |
1260 HistoryCommitType historyCommitType = loadTypeToCommitType(m_loadType); | 1254 HistoryCommitType historyCommitType = loadTypeToCommitType(m_loadType); |
1261 if (loader == m_provisionalDocumentLoader) { | 1255 if (loader == m_provisionalDocumentLoader) { |
1262 client()->dispatchDidFailProvisionalLoad(error, historyCommitType); | 1256 client()->dispatchDidFailProvisionalLoad(error, historyCommitType); |
1263 if (loader != m_provisionalDocumentLoader) | 1257 if (loader != m_provisionalDocumentLoader) |
1264 return; | 1258 return; |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1403 NavigationType navigationType = determineNavigationType(type, frameLoadReque st.resourceRequest().httpBody() || frameLoadRequest.form(), frameLoadRequest.tri ggeringEvent()); | 1397 NavigationType navigationType = determineNavigationType(type, frameLoadReque st.resourceRequest().httpBody() || frameLoadRequest.form(), frameLoadRequest.tri ggeringEvent()); |
1404 frameLoadRequest.resourceRequest().setRequestContext(determineRequestContext FromNavigationType(navigationType)); | 1398 frameLoadRequest.resourceRequest().setRequestContext(determineRequestContext FromNavigationType(navigationType)); |
1405 frameLoadRequest.resourceRequest().setFrameType(m_frame->isMainFrame() ? Web URLRequest::FrameTypeTopLevel : WebURLRequest::FrameTypeNested); | 1399 frameLoadRequest.resourceRequest().setFrameType(m_frame->isMainFrame() ? Web URLRequest::FrameTypeTopLevel : WebURLRequest::FrameTypeNested); |
1406 ResourceRequest& request = frameLoadRequest.resourceRequest(); | 1400 ResourceRequest& request = frameLoadRequest.resourceRequest(); |
1407 if (!shouldContinueForNavigationPolicy(request, frameLoadRequest.substituteD ata(), nullptr, frameLoadRequest.shouldCheckMainWorldContentSecurityPolicy(), na vigationType, navigationPolicy, type == FrameLoadTypeReplaceCurrentItem, frameLo adRequest.clientRedirect() == ClientRedirect)) | 1401 if (!shouldContinueForNavigationPolicy(request, frameLoadRequest.substituteD ata(), nullptr, frameLoadRequest.shouldCheckMainWorldContentSecurityPolicy(), na vigationType, navigationPolicy, type == FrameLoadTypeReplaceCurrentItem, frameLo adRequest.clientRedirect() == ClientRedirect)) |
1408 return; | 1402 return; |
1409 if (!shouldClose(navigationType == NavigationTypeReload)) | 1403 if (!shouldClose(navigationType == NavigationTypeReload)) |
1410 return; | 1404 return; |
1411 | 1405 |
1412 m_frame->document()->cancelParsing(); | 1406 m_frame->document()->cancelParsing(); |
1413 | 1407 detachDocumentLoader(m_provisionalDocumentLoader); |
1414 if (m_provisionalDocumentLoader) { | |
1415 m_provisionalDocumentLoader->stopLoading(); | |
1416 detachDocumentLoader(m_provisionalDocumentLoader); | |
1417 } | |
1418 | 1408 |
1419 // beforeunload fired above, and detaching a DocumentLoader can fire | 1409 // beforeunload fired above, and detaching a DocumentLoader can fire |
1420 // events, which can detach this frame. | 1410 // events, which can detach this frame. |
1421 if (!m_frame->host()) | 1411 if (!m_frame->host()) |
1422 return; | 1412 return; |
1423 | 1413 |
1424 m_provisionalDocumentLoader = client()->createDocumentLoader(m_frame, reques t, frameLoadRequest.substituteData().isValid() ? frameLoadRequest.substituteData () : defaultSubstituteDataForURL(request.url())); | 1414 m_provisionalDocumentLoader = client()->createDocumentLoader(m_frame, reques t, frameLoadRequest.substituteData().isValid() ? frameLoadRequest.substituteData () : defaultSubstituteDataForURL(request.url())); |
1425 m_provisionalDocumentLoader->setNavigationType(navigationType); | 1415 m_provisionalDocumentLoader->setNavigationType(navigationType); |
1426 m_provisionalDocumentLoader->setReplacesCurrentHistoryItem(type == FrameLoad TypeReplaceCurrentItem); | 1416 m_provisionalDocumentLoader->setReplacesCurrentHistoryItem(type == FrameLoad TypeReplaceCurrentItem); |
1427 m_provisionalDocumentLoader->setIsClientRedirect(frameLoadRequest.clientRedi rect() == ClientRedirect); | 1417 m_provisionalDocumentLoader->setIsClientRedirect(frameLoadRequest.clientRedi rect() == ClientRedirect); |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1600 // FIXME: We need a way to propagate insecure requests policy flags to | 1590 // FIXME: We need a way to propagate insecure requests policy flags to |
1601 // out-of-process frames. For now, we'll always use default behavior. | 1591 // out-of-process frames. For now, we'll always use default behavior. |
1602 if (!parentFrame->isLocalFrame()) | 1592 if (!parentFrame->isLocalFrame()) |
1603 return nullptr; | 1593 return nullptr; |
1604 | 1594 |
1605 ASSERT(toLocalFrame(parentFrame)->document()); | 1595 ASSERT(toLocalFrame(parentFrame)->document()); |
1606 return toLocalFrame(parentFrame)->document()->insecureNavigationsToUpgrade() ; | 1596 return toLocalFrame(parentFrame)->document()->insecureNavigationsToUpgrade() ; |
1607 } | 1597 } |
1608 | 1598 |
1609 } // namespace blink | 1599 } // namespace blink |
OLD | NEW |