Chromium Code Reviews| 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 26 matching lines...) Expand all Loading... | |
| 37 | 37 |
| 38 #include "bindings/core/v8/DOMWrapperWorld.h" | 38 #include "bindings/core/v8/DOMWrapperWorld.h" |
| 39 #include "bindings/core/v8/ScriptController.h" | 39 #include "bindings/core/v8/ScriptController.h" |
| 40 #include "bindings/core/v8/SerializedScriptValue.h" | 40 #include "bindings/core/v8/SerializedScriptValue.h" |
| 41 #include "core/HTMLNames.h" | 41 #include "core/HTMLNames.h" |
| 42 #include "core/dom/Document.h" | 42 #include "core/dom/Document.h" |
| 43 #include "core/dom/Element.h" | 43 #include "core/dom/Element.h" |
| 44 #include "core/dom/ViewportDescription.h" | 44 #include "core/dom/ViewportDescription.h" |
| 45 #include "core/editing/Editor.h" | 45 #include "core/editing/Editor.h" |
| 46 #include "core/editing/UndoStack.h" | 46 #include "core/editing/UndoStack.h" |
| 47 #include "core/events/MouseEvent.h" | |
| 47 #include "core/events/PageTransitionEvent.h" | 48 #include "core/events/PageTransitionEvent.h" |
| 48 #include "core/fetch/FetchContext.h" | 49 #include "core/fetch/FetchContext.h" |
| 49 #include "core/fetch/ResourceFetcher.h" | 50 #include "core/fetch/ResourceFetcher.h" |
| 50 #include "core/fetch/ResourceLoader.h" | 51 #include "core/fetch/ResourceLoader.h" |
| 51 #include "core/frame/LocalDOMWindow.h" | 52 #include "core/frame/LocalDOMWindow.h" |
| 52 #include "core/frame/FrameHost.h" | 53 #include "core/frame/FrameHost.h" |
| 53 #include "core/frame/FrameView.h" | 54 #include "core/frame/FrameView.h" |
| 54 #include "core/frame/LocalFrame.h" | 55 #include "core/frame/LocalFrame.h" |
| 55 #include "core/frame/PinchViewport.h" | 56 #include "core/frame/PinchViewport.h" |
| 56 #include "core/frame/Settings.h" | 57 #include "core/frame/Settings.h" |
| (...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 676 return FrameLoadTypeRedirectWithLockedBackForwardList; | 677 return FrameLoadTypeRedirectWithLockedBackForwardList; |
| 677 if (!request.originDocument() && request.resourceRequest().url() == m_docume ntLoader->urlForHistory()) | 678 if (!request.originDocument() && request.resourceRequest().url() == m_docume ntLoader->urlForHistory()) |
| 678 return FrameLoadTypeSame; | 679 return FrameLoadTypeSame; |
| 679 if (request.substituteData().failingURL() == m_documentLoader->urlForHistory () && m_loadType == FrameLoadTypeReload) | 680 if (request.substituteData().failingURL() == m_documentLoader->urlForHistory () && m_loadType == FrameLoadTypeReload) |
| 680 return FrameLoadTypeReload; | 681 return FrameLoadTypeReload; |
| 681 return FrameLoadTypeStandard; | 682 return FrameLoadTypeStandard; |
| 682 } | 683 } |
| 683 | 684 |
| 684 bool FrameLoader::prepareRequestForThisFrame(FrameLoadRequest& request) | 685 bool FrameLoader::prepareRequestForThisFrame(FrameLoadRequest& request) |
| 685 { | 686 { |
| 686 request.resourceRequest().setFrameType(m_frame->isMainFrame() ? WebURLReques t::FrameTypeTopLevel : WebURLRequest::FrameTypeNested); | |
| 687 | |
| 688 // If no origin Document* was specified, skip remaining security checks and assume the caller has fully initialized the FrameLoadRequest. | 687 // If no origin Document* was specified, skip remaining security checks and assume the caller has fully initialized the FrameLoadRequest. |
| 689 if (!request.originDocument()) | 688 if (!request.originDocument()) |
| 690 return true; | 689 return true; |
| 691 | 690 |
| 692 KURL url = request.resourceRequest().url(); | 691 KURL url = request.resourceRequest().url(); |
| 693 if (m_frame->script().executeScriptIfJavaScriptURL(url)) | 692 if (m_frame->script().executeScriptIfJavaScriptURL(url)) |
| 694 return false; | 693 return false; |
| 695 | 694 |
| 696 if (!request.originDocument()->securityOrigin()->canDisplay(url)) { | 695 if (!request.originDocument()->securityOrigin()->canDisplay(url)) { |
| 697 reportLocalLoadFailed(m_frame, url.elidedString()); | 696 reportLocalLoadFailed(m_frame, url.elidedString()); |
| 698 return false; | 697 return false; |
| 699 } | 698 } |
| 700 | 699 |
| 701 if (!request.formState() && request.frameName().isEmpty()) | 700 if (!request.formState() && request.frameName().isEmpty()) |
| 702 request.setFrameName(m_frame->document()->baseTarget()); | 701 request.setFrameName(m_frame->document()->baseTarget()); |
| 703 return true; | 702 return true; |
| 704 } | 703 } |
| 705 | 704 |
| 706 static bool shouldOpenInNewWindow(LocalFrame* targetFrame, const FrameLoadReques t& request, const NavigationAction& action) | 705 static bool shouldOpenInNewWindow(LocalFrame* targetFrame, const FrameLoadReques t& request, NavigationPolicy policy) |
| 707 { | 706 { |
| 708 if (!targetFrame && !request.frameName().isEmpty()) | 707 if (!targetFrame && !request.frameName().isEmpty()) |
| 709 return true; | 708 return true; |
| 710 // FIXME: This case is a workaround for the fact that ctrl+clicking a form s ubmission incorrectly | 709 // FIXME: This case is a workaround for the fact that ctrl+clicking a form s ubmission incorrectly |
| 711 // sends as a GET rather than a POST if it creates a new window in a differe nt process. | 710 // sends as a GET rather than a POST if it creates a new window in a differe nt process. |
| 712 return request.formState() && action.shouldOpenInNewWindow(); | 711 return request.formState() && policy != NavigationPolicyCurrentTab; |
| 712 } | |
| 713 | |
| 714 static NavigationType determineNavigationType(FrameLoadType frameLoadType, bool isFormSubmission, bool haveEvent) | |
| 715 { | |
| 716 bool isReload = frameLoadType == FrameLoadTypeReload || frameLoadType == Fra meLoadTypeReloadFromOrigin; | |
| 717 bool isBackForward = isBackForwardLoadType(frameLoadType); | |
| 718 if (isFormSubmission) | |
| 719 return (isReload || isBackForward) ? NavigationTypeFormResubmitted : Nav igationTypeFormSubmitted; | |
| 720 if (haveEvent) | |
| 721 return NavigationTypeLinkClicked; | |
| 722 if (isReload) | |
| 723 return NavigationTypeReload; | |
| 724 if (isBackForward) | |
| 725 return NavigationTypeBackForward; | |
| 726 return NavigationTypeOther; | |
| 713 } | 727 } |
| 714 | 728 |
| 715 static WebURLRequest::RequestContext determineRequestContextFromNavigationType(c onst NavigationType navigationType) | 729 static WebURLRequest::RequestContext determineRequestContextFromNavigationType(c onst NavigationType navigationType) |
| 716 { | 730 { |
| 717 switch (navigationType) { | 731 switch (navigationType) { |
| 718 case NavigationTypeLinkClicked: | 732 case NavigationTypeLinkClicked: |
| 719 return WebURLRequest::RequestContextHyperlink; | 733 return WebURLRequest::RequestContextHyperlink; |
| 720 | 734 |
| 721 case NavigationTypeOther: | 735 case NavigationTypeOther: |
| 722 return WebURLRequest::RequestContextLocation; | 736 return WebURLRequest::RequestContextLocation; |
| 723 | 737 |
| 724 case NavigationTypeFormResubmitted: | 738 case NavigationTypeFormResubmitted: |
| 725 case NavigationTypeFormSubmitted: | 739 case NavigationTypeFormSubmitted: |
| 726 return WebURLRequest::RequestContextForm; | 740 return WebURLRequest::RequestContextForm; |
| 727 | 741 |
| 728 case NavigationTypeBackForward: | 742 case NavigationTypeBackForward: |
| 729 case NavigationTypeReload: | 743 case NavigationTypeReload: |
| 730 return WebURLRequest::RequestContextInternal; | 744 return WebURLRequest::RequestContextInternal; |
| 731 } | 745 } |
| 732 ASSERT_NOT_REACHED(); | 746 ASSERT_NOT_REACHED(); |
| 733 return WebURLRequest::RequestContextHyperlink; | 747 return WebURLRequest::RequestContextHyperlink; |
| 734 } | 748 } |
| 735 | 749 |
| 750 static NavigationPolicy navigationPolicyForRequest(const FrameLoadRequest& reque st) | |
| 751 { | |
| 752 NavigationPolicy policy = NavigationPolicyCurrentTab; | |
| 753 Event* event = request.triggeringEvent(); | |
| 754 if (!event) | |
| 755 return policy; | |
| 756 | |
| 757 if (request.formState() && event->underlyingEvent()) | |
| 758 event = event->underlyingEvent(); | |
| 759 if (!event->isMouseEvent()) | |
| 760 return policy; | |
| 761 | |
| 762 const MouseEvent* mouseEvent = toMouseEvent(event); | |
| 763 navigationPolicyFromMouseEvent(mouseEvent->button(), mouseEvent->ctrlKey(), mouseEvent->shiftKey(), mouseEvent->altKey(), mouseEvent->metaKey(), &policy); | |
|
dcheng
2014/12/16 18:57:04
It seems kind of odd that we ignore the bool retur
| |
| 764 return policy; | |
| 765 } | |
| 766 | |
| 736 void FrameLoader::load(const FrameLoadRequest& passedRequest) | 767 void FrameLoader::load(const FrameLoadRequest& passedRequest) |
| 737 { | 768 { |
| 738 ASSERT(m_frame->document()); | 769 ASSERT(m_frame->document()); |
| 739 | 770 |
| 740 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); | 771 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); |
| 741 | 772 |
| 742 if (m_inStopAllLoaders) | 773 if (m_inStopAllLoaders) |
| 743 return; | 774 return; |
| 744 | 775 |
| 745 FrameLoadRequest request(passedRequest); | 776 FrameLoadRequest request(passedRequest); |
| 746 if (!prepareRequestForThisFrame(request)) | 777 if (!prepareRequestForThisFrame(request)) |
| 747 return; | 778 return; |
| 748 | 779 |
| 749 RefPtrWillBeRawPtr<LocalFrame> targetFrame = request.formState() ? 0 : findF rameForNavigation(AtomicString(request.frameName()), request.formState() ? reque st.formState()->sourceDocument() : m_frame->document()); | 780 RefPtrWillBeRawPtr<LocalFrame> targetFrame = request.formState() ? 0 : findF rameForNavigation(AtomicString(request.frameName()), request.formState() ? reque st.formState()->sourceDocument() : m_frame->document()); |
| 750 if (targetFrame && targetFrame.get() != m_frame) { | 781 if (targetFrame && targetFrame.get() != m_frame) { |
| 751 request.setFrameName("_self"); | 782 request.setFrameName("_self"); |
| 752 targetFrame->loader().load(request); | 783 targetFrame->loader().load(request); |
| 753 if (Page* page = targetFrame->page()) | 784 if (Page* page = targetFrame->page()) |
| 754 page->chrome().focus(); | 785 page->chrome().focus(); |
| 755 return; | 786 return; |
| 756 } | 787 } |
| 757 | 788 |
| 758 setReferrerForFrameRequest(request.resourceRequest(), request.shouldSendRefe rrer(), request.originDocument()); | 789 setReferrerForFrameRequest(request.resourceRequest(), request.shouldSendRefe rrer(), request.originDocument()); |
| 759 | 790 |
| 760 FrameLoadType newLoadType = determineFrameLoadType(request); | 791 FrameLoadType newLoadType = determineFrameLoadType(request); |
| 761 NavigationAction action(request.resourceRequest(), newLoadType, request.form State(), request.triggeringEvent()); | 792 NavigationPolicy policy = navigationPolicyForRequest(request); |
| 762 if (action.resourceRequest().requestContext() == WebURLRequest::RequestConte xtUnspecified) | 793 if (shouldOpenInNewWindow(targetFrame.get(), request, policy)) { |
| 763 action.mutableResourceRequest().setRequestContext(determineRequestContex tFromNavigationType(action.type())); | 794 if (policy == NavigationPolicyDownload) |
| 764 if (shouldOpenInNewWindow(targetFrame.get(), request, action)) { | 795 client()->loadURLExternally(request.resourceRequest(), NavigationPol icyDownload); |
| 765 if (action.policy() == NavigationPolicyDownload) | |
| 766 client()->loadURLExternally(action.resourceRequest(), NavigationPoli cyDownload); | |
| 767 else | 796 else |
| 768 createWindowForRequest(request, *m_frame, action.policy(), request.s houldSendReferrer()); | 797 createWindowForRequest(request, *m_frame, policy, request.shouldSend Referrer()); |
| 769 return; | 798 return; |
| 770 } | 799 } |
| 771 | 800 |
| 772 const KURL& url = request.resourceRequest().url(); | 801 const KURL& url = request.resourceRequest().url(); |
| 773 if (!action.shouldOpenInNewWindow() && shouldPerformFragmentNavigation(reque st.formState(), request.resourceRequest().httpMethod(), newLoadType, url)) { | 802 if (policy == NavigationPolicyCurrentTab && shouldPerformFragmentNavigation( request.formState(), request.resourceRequest().httpMethod(), newLoadType, url)) { |
| 774 m_documentLoader->setTriggeringAction(action); | 803 m_documentLoader->setNavigationType(determineNavigationType(newLoadType, false, request.triggeringEvent())); |
| 775 if (shouldTreatURLAsSameAsCurrent(url)) | 804 if (shouldTreatURLAsSameAsCurrent(url)) |
| 776 newLoadType = FrameLoadTypeRedirectWithLockedBackForwardList; | 805 newLoadType = FrameLoadTypeRedirectWithLockedBackForwardList; |
| 777 loadInSameDocument(url, nullptr, newLoadType, request.clientRedirect()); | 806 loadInSameDocument(url, nullptr, newLoadType, request.clientRedirect()); |
| 778 return; | 807 return; |
| 779 } | 808 } |
| 780 bool sameURL = url == m_documentLoader->urlForHistory(); | 809 bool sameURL = url == m_documentLoader->urlForHistory(); |
| 781 loadWithNavigationAction(action, newLoadType, request.formState(), request.s ubstituteData(), request.shouldCheckMainWorldContentSecurityPolicy(), request.cl ientRedirect(), request.triggeringEvent()); | 810 startLoad(request, newLoadType, policy); |
| 782 // Example of this case are sites that reload the same URL with a different cookie | 811 // Example of this case are sites that reload the same URL with a different cookie |
| 783 // driving the generated content, or a master frame with links that drive a target | 812 // driving the generated content, or a master frame with links that drive a target |
| 784 // frame, where the user has clicked on the same link repeatedly. | 813 // frame, where the user has clicked on the same link repeatedly. |
| 785 if (sameURL && newLoadType != FrameLoadTypeReload && newLoadType != FrameLoa dTypeReloadFromOrigin && request.resourceRequest().httpMethod() != "POST") | 814 if (sameURL && newLoadType != FrameLoadTypeReload && newLoadType != FrameLoa dTypeReloadFromOrigin && request.resourceRequest().httpMethod() != "POST") |
| 786 m_loadType = FrameLoadTypeSame; | 815 m_loadType = FrameLoadTypeSame; |
| 787 } | 816 } |
| 788 | 817 |
| 789 SubstituteData FrameLoader::defaultSubstituteDataForURL(const KURL& url) | 818 SubstituteData FrameLoader::defaultSubstituteDataForURL(const KURL& url) |
| 790 { | 819 { |
| 791 if (!shouldTreatURLAsSrcdocDocument(url)) | 820 if (!shouldTreatURLAsSrcdocDocument(url)) |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 822 return request; | 851 return request; |
| 823 } | 852 } |
| 824 | 853 |
| 825 void FrameLoader::reload(ReloadPolicy reloadPolicy, const KURL& overrideURL, Cli entRedirectPolicy clientRedirectPolicy) | 854 void FrameLoader::reload(ReloadPolicy reloadPolicy, const KURL& overrideURL, Cli entRedirectPolicy clientRedirectPolicy) |
| 826 { | 855 { |
| 827 if (!m_currentItem) | 856 if (!m_currentItem) |
| 828 return; | 857 return; |
| 829 | 858 |
| 830 ResourceRequestCachePolicy cachePolicy = reloadPolicy == EndToEndReload ? Re loadBypassingCache : ReloadIgnoringCacheData; | 859 ResourceRequestCachePolicy cachePolicy = reloadPolicy == EndToEndReload ? Re loadBypassingCache : ReloadIgnoringCacheData; |
| 831 ResourceRequest request = requestFromHistoryItem(m_currentItem.get(), cacheP olicy); | 860 ResourceRequest request = requestFromHistoryItem(m_currentItem.get(), cacheP olicy); |
| 832 request.setFrameType(m_frame->isMainFrame() ? WebURLRequest::FrameTypeTopLev el : WebURLRequest::FrameTypeNested); | |
| 833 request.setRequestContext(WebURLRequest::RequestContextInternal); | |
| 834 | 861 |
| 835 // ClientRedirectPolicy is an indication that this load was triggered by | 862 // ClientRedirectPolicy is an indication that this load was triggered by |
| 836 // some direct interaction with the page. If this reload is not a client | 863 // some direct interaction with the page. If this reload is not a client |
| 837 // redirect, we should reuse the referrer from the original load of the | 864 // redirect, we should reuse the referrer from the original load of the |
| 838 // current document. If this reload is a client redirect (e.g., location.rel oad()), | 865 // current document. If this reload is a client redirect (e.g., location.rel oad()), |
| 839 // it was initiated by something in the current document and should | 866 // it was initiated by something in the current document and should |
| 840 // therefore show the current document's url as the referrer. | 867 // therefore show the current document's url as the referrer. |
| 841 if (clientRedirectPolicy == ClientRedirect) | 868 if (clientRedirectPolicy == ClientRedirect) |
| 842 request.setHTTPReferrer(Referrer(m_frame->document()->outgoingReferrer() , m_frame->document()->referrerPolicy())); | 869 request.setHTTPReferrer(Referrer(m_frame->document()->outgoingReferrer() , m_frame->document()->referrerPolicy())); |
| 843 | 870 |
| 844 if (!overrideURL.isEmpty()) { | 871 if (!overrideURL.isEmpty()) { |
| 845 request.setURL(overrideURL); | 872 request.setURL(overrideURL); |
| 846 request.clearHTTPReferrer(); | 873 request.clearHTTPReferrer(); |
| 847 } | 874 } |
| 848 request.setSkipServiceWorker(reloadPolicy == EndToEndReload); | 875 request.setSkipServiceWorker(reloadPolicy == EndToEndReload); |
| 849 | 876 FrameLoadRequest frameLoadRequest(nullptr, request); |
| 850 FrameLoadType type = reloadPolicy == EndToEndReload ? FrameLoadTypeReloadFro mOrigin : FrameLoadTypeReload; | 877 frameLoadRequest.setClientRedirect(clientRedirectPolicy); |
| 851 loadWithNavigationAction(NavigationAction(request, type), type, nullptr, Sub stituteData(), CheckContentSecurityPolicy, clientRedirectPolicy); | 878 startLoad(frameLoadRequest, reloadPolicy == EndToEndReload ? FrameLoadTypeRe loadFromOrigin : FrameLoadTypeReload, NavigationPolicyCurrentTab); |
| 852 } | 879 } |
| 853 | 880 |
| 854 void FrameLoader::stopAllLoaders() | 881 void FrameLoader::stopAllLoaders() |
| 855 { | 882 { |
| 856 if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::No Dismissal) | 883 if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::No Dismissal) |
| 857 return; | 884 return; |
| 858 | 885 |
| 859 // If this method is called from within this method, infinite recursion can occur (3442218). Avoid this. | 886 // If this method is called from within this method, infinite recursion can occur (3442218). Avoid this. |
| 860 if (m_inStopAllLoaders) | 887 if (m_inStopAllLoaders) |
| 861 return; | 888 return; |
| (...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1255 if (elementData.isEmpty() || !validateTransitionNavigationMode()) | 1282 if (elementData.isEmpty() || !validateTransitionNavigationMode()) |
| 1256 return false; | 1283 return false; |
| 1257 | 1284 |
| 1258 Vector<Document::TransitionElementData>::iterator iter = elementData.begin() ; | 1285 Vector<Document::TransitionElementData>::iterator iter = elementData.begin() ; |
| 1259 for (; iter != elementData.end(); ++iter) | 1286 for (; iter != elementData.end(); ++iter) |
| 1260 client()->dispatchAddNavigationTransitionData(*iter); | 1287 client()->dispatchAddNavigationTransitionData(*iter); |
| 1261 | 1288 |
| 1262 return true; | 1289 return true; |
| 1263 } | 1290 } |
| 1264 | 1291 |
| 1265 void FrameLoader::loadWithNavigationAction(const NavigationAction& action, Frame LoadType type, PassRefPtrWillBeRawPtr<FormState> formState, const SubstituteData & substituteData, ContentSecurityPolicyDisposition shouldCheckMainWorldContentSe curityPolicy, ClientRedirectPolicy clientRedirect, Event* triggeringEvent) | 1292 void FrameLoader::startLoad(FrameLoadRequest& frameLoadRequest, FrameLoadType ty pe, NavigationPolicy navigationPolicy) |
| 1266 { | 1293 { |
| 1267 ASSERT(client()->hasWebView()); | 1294 ASSERT(client()->hasWebView()); |
| 1268 if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::No Dismissal) | 1295 if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::No Dismissal) |
| 1269 return; | 1296 return; |
| 1270 | 1297 |
| 1271 const ResourceRequest& request = action.resourceRequest(); | 1298 NavigationType navigationType = determineNavigationType(type, frameLoadReque st.resourceRequest().httpBody() || frameLoadRequest.formState(), frameLoadReques t.triggeringEvent()); |
| 1299 frameLoadRequest.resourceRequest().setRequestContext(determineRequestContext FromNavigationType(navigationType)); | |
| 1300 frameLoadRequest.resourceRequest().setFrameType(m_frame->isMainFrame() ? Web URLRequest::FrameTypeTopLevel : WebURLRequest::FrameTypeNested); | |
| 1301 ResourceRequest& request = frameLoadRequest.resourceRequest(); | |
| 1272 | 1302 |
| 1273 // The current load should replace the history item if it is the first real | 1303 // The current load should replace the history item if it is the first real |
| 1274 // load of the frame. | 1304 // load of the frame. |
| 1275 bool replacesCurrentHistoryItem = false; | 1305 bool replacesCurrentHistoryItem = false; |
| 1276 if (type == FrameLoadTypeRedirectWithLockedBackForwardList | 1306 if (type == FrameLoadTypeRedirectWithLockedBackForwardList |
| 1277 || !m_stateMachine.committedFirstRealDocumentLoad()) { | 1307 || !m_stateMachine.committedFirstRealDocumentLoad()) { |
| 1278 replacesCurrentHistoryItem = true; | 1308 replacesCurrentHistoryItem = true; |
| 1279 } | 1309 } |
| 1280 | 1310 |
| 1281 m_policyDocumentLoader = client()->createDocumentLoader(m_frame, request, su bstituteData.isValid() ? substituteData : defaultSubstituteDataForURL(request.ur l())); | 1311 m_policyDocumentLoader = client()->createDocumentLoader(m_frame, request, fr ameLoadRequest.substituteData().isValid() ? frameLoadRequest.substituteData() : defaultSubstituteDataForURL(request.url())); |
| 1282 m_policyDocumentLoader->setTriggeringAction(action); | 1312 m_policyDocumentLoader->setNavigationType(navigationType); |
| 1283 m_policyDocumentLoader->setReplacesCurrentHistoryItem(replacesCurrentHistory Item); | 1313 m_policyDocumentLoader->setReplacesCurrentHistoryItem(replacesCurrentHistory Item); |
| 1284 m_policyDocumentLoader->setIsClientRedirect(clientRedirect == ClientRedirect ); | 1314 m_policyDocumentLoader->setIsClientRedirect(frameLoadRequest.clientRedirect( ) == ClientRedirect); |
| 1285 | 1315 |
| 1286 bool isTransitionNavigation = false; | 1316 bool isTransitionNavigation = false; |
| 1287 if (RuntimeEnabledFeatures::navigationTransitionsEnabled() && type != FrameL oadTypeReload && type != FrameLoadTypeReloadFromOrigin && type != FrameLoadTypeS ame) | 1317 if (RuntimeEnabledFeatures::navigationTransitionsEnabled() && type != FrameL oadTypeReload && type != FrameLoadTypeReloadFromOrigin && type != FrameLoadTypeS ame) |
| 1288 isTransitionNavigation = dispatchNavigationTransitionData(); | 1318 isTransitionNavigation = dispatchNavigationTransitionData(); |
| 1289 | 1319 |
| 1290 // stopAllLoaders can detach the LocalFrame, so protect it. | 1320 // stopAllLoaders can detach the LocalFrame, so protect it. |
| 1291 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); | 1321 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); |
| 1292 if ((!m_policyDocumentLoader->shouldContinueForNavigationPolicy(request, sho uldCheckMainWorldContentSecurityPolicy, isTransitionNavigation) || !shouldClose( )) && m_policyDocumentLoader) { | 1322 if ((!m_policyDocumentLoader->shouldContinueForNavigationPolicy(request, fra meLoadRequest.shouldCheckMainWorldContentSecurityPolicy(), navigationPolicy, isT ransitionNavigation) || !shouldClose()) && m_policyDocumentLoader) { |
| 1293 m_policyDocumentLoader->detachFromFrame(); | 1323 m_policyDocumentLoader->detachFromFrame(); |
| 1294 m_policyDocumentLoader = nullptr; | 1324 m_policyDocumentLoader = nullptr; |
| 1295 if (!m_stateMachine.committedFirstRealDocumentLoad()) | 1325 if (!m_stateMachine.committedFirstRealDocumentLoad()) |
| 1296 m_state = FrameStateComplete; | 1326 m_state = FrameStateComplete; |
| 1297 checkCompleted(); | 1327 checkCompleted(); |
| 1298 return; | 1328 return; |
| 1299 } | 1329 } |
| 1300 | 1330 |
| 1301 if (m_provisionalDocumentLoader) { | 1331 if (m_provisionalDocumentLoader) { |
| 1302 m_provisionalDocumentLoader->stopLoading(); | 1332 m_provisionalDocumentLoader->stopLoading(); |
| 1303 if (m_provisionalDocumentLoader) | 1333 if (m_provisionalDocumentLoader) |
| 1304 m_provisionalDocumentLoader->detachFromFrame(); | 1334 m_provisionalDocumentLoader->detachFromFrame(); |
| 1305 m_provisionalDocumentLoader = nullptr; | 1335 m_provisionalDocumentLoader = nullptr; |
| 1306 } | 1336 } |
| 1307 m_checkTimer.stop(); | 1337 m_checkTimer.stop(); |
| 1308 | 1338 |
| 1309 // <rdar://problem/6250856> - In certain circumstances on pages with multipl e frames, stopAllLoaders() | 1339 // <rdar://problem/6250856> - In certain circumstances on pages with multipl e frames, stopAllLoaders() |
| 1310 // might detach the current FrameLoader, in which case we should bail on thi s newly defunct load. | 1340 // might detach the current FrameLoader, in which case we should bail on thi s newly defunct load. |
| 1311 if (!m_frame->page() || !m_policyDocumentLoader) | 1341 if (!m_frame->page() || !m_policyDocumentLoader) |
| 1312 return; | 1342 return; |
| 1313 | 1343 |
| 1314 if (isLoadingMainFrame()) | 1344 if (isLoadingMainFrame()) |
| 1315 m_frame->page()->inspectorController().resume(); | 1345 m_frame->page()->inspectorController().resume(); |
| 1316 m_frame->navigationScheduler().cancel(); | 1346 m_frame->navigationScheduler().cancel(); |
| 1317 | 1347 |
| 1318 m_provisionalDocumentLoader = m_policyDocumentLoader.release(); | 1348 m_provisionalDocumentLoader = m_policyDocumentLoader.release(); |
| 1319 m_loadType = type; | 1349 m_loadType = type; |
| 1320 m_state = FrameStateProvisional; | 1350 m_state = FrameStateProvisional; |
| 1321 | 1351 |
| 1322 if (formState) | 1352 if (FormState* formState = frameLoadRequest.formState()) |
| 1323 client()->dispatchWillSubmitForm(formState->form()); | 1353 client()->dispatchWillSubmitForm(formState->form()); |
| 1324 | 1354 |
| 1325 m_progressTracker->progressStarted(); | 1355 m_progressTracker->progressStarted(); |
| 1326 if (m_provisionalDocumentLoader->isClientRedirect()) | 1356 if (m_provisionalDocumentLoader->isClientRedirect()) |
| 1327 m_provisionalDocumentLoader->appendRedirect(m_frame->document()->url()); | 1357 m_provisionalDocumentLoader->appendRedirect(m_frame->document()->url()); |
| 1328 m_provisionalDocumentLoader->appendRedirect(m_provisionalDocumentLoader->req uest().url()); | 1358 m_provisionalDocumentLoader->appendRedirect(m_provisionalDocumentLoader->req uest().url()); |
| 1329 double triggeringEventTime = triggeringEvent ? convertDOMTimeStampToSeconds( triggeringEvent->timeStamp()) : 0; | 1359 double triggeringEventTime = frameLoadRequest.triggeringEvent() ? convertDOM TimeStampToSeconds(frameLoadRequest.triggeringEvent()->timeStamp()) : 0; |
| 1330 client()->dispatchDidStartProvisionalLoad(isTransitionNavigation, triggering EventTime); | 1360 client()->dispatchDidStartProvisionalLoad(isTransitionNavigation, triggering EventTime); |
| 1331 ASSERT(m_provisionalDocumentLoader); | 1361 ASSERT(m_provisionalDocumentLoader); |
| 1332 m_provisionalDocumentLoader->startLoadingMainResource(); | 1362 m_provisionalDocumentLoader->startLoadingMainResource(); |
| 1333 } | 1363 } |
| 1334 | 1364 |
| 1335 void FrameLoader::applyUserAgent(ResourceRequest& request) | 1365 void FrameLoader::applyUserAgent(ResourceRequest& request) |
| 1336 { | 1366 { |
| 1337 String userAgent = this->userAgent(request.url()); | 1367 String userAgent = this->userAgent(request.url()); |
| 1338 ASSERT(!userAgent.isNull()); | 1368 ASSERT(!userAgent.isNull()); |
| 1339 request.setHTTPUserAgent(AtomicString(userAgent)); | 1369 request.setHTTPUserAgent(AtomicString(userAgent)); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1417 m_deferredHistoryLoad = DeferredHistoryLoad(item, historyLoadType, cache Policy); | 1447 m_deferredHistoryLoad = DeferredHistoryLoad(item, historyLoadType, cache Policy); |
| 1418 return; | 1448 return; |
| 1419 } | 1449 } |
| 1420 | 1450 |
| 1421 m_provisionalItem = item; | 1451 m_provisionalItem = item; |
| 1422 if (historyLoadType == HistorySameDocumentLoad) { | 1452 if (historyLoadType == HistorySameDocumentLoad) { |
| 1423 loadInSameDocument(item->url(), item->stateObject(), frameLoadType, NotC lientRedirect); | 1453 loadInSameDocument(item->url(), item->stateObject(), frameLoadType, NotC lientRedirect); |
| 1424 restoreScrollPositionAndViewState(); | 1454 restoreScrollPositionAndViewState(); |
| 1425 return; | 1455 return; |
| 1426 } | 1456 } |
| 1427 | 1457 FrameLoadRequest request(nullptr, requestFromHistoryItem(item, cachePolicy)) ; |
| 1428 ResourceRequest request = requestFromHistoryItem(item, cachePolicy); | 1458 startLoad(request, frameLoadType, NavigationPolicyCurrentTab); |
| 1429 request.setFrameType(m_frame->isMainFrame() ? WebURLRequest::FrameTypeTopLev el : WebURLRequest::FrameTypeNested); | |
| 1430 request.setRequestContext(WebURLRequest::RequestContextInternal); | |
| 1431 loadWithNavigationAction(NavigationAction(request, frameLoadType), frameLoad Type, nullptr, SubstituteData(), CheckContentSecurityPolicy); | |
| 1432 } | 1459 } |
| 1433 | 1460 |
| 1434 void FrameLoader::dispatchDocumentElementAvailable() | 1461 void FrameLoader::dispatchDocumentElementAvailable() |
| 1435 { | 1462 { |
| 1436 client()->documentElementAvailable(); | 1463 client()->documentElementAvailable(); |
| 1437 } | 1464 } |
| 1438 | 1465 |
| 1439 void FrameLoader::dispatchDidClearDocumentOfWindowObject() | 1466 void FrameLoader::dispatchDidClearDocumentOfWindowObject() |
| 1440 { | 1467 { |
| 1441 if (!m_frame->script().canExecuteScripts(NotAboutToExecuteScript)) | 1468 if (!m_frame->script().canExecuteScripts(NotAboutToExecuteScript)) |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 1464 // FIXME: We need a way to propagate sandbox flags to out-of-process frames. | 1491 // FIXME: We need a way to propagate sandbox flags to out-of-process frames. |
| 1465 Frame* parentFrame = m_frame->tree().parent(); | 1492 Frame* parentFrame = m_frame->tree().parent(); |
| 1466 if (parentFrame && parentFrame->isLocalFrame()) | 1493 if (parentFrame && parentFrame->isLocalFrame()) |
| 1467 flags |= toLocalFrame(parentFrame)->document()->sandboxFlags(); | 1494 flags |= toLocalFrame(parentFrame)->document()->sandboxFlags(); |
| 1468 if (FrameOwner* frameOwner = m_frame->owner()) | 1495 if (FrameOwner* frameOwner = m_frame->owner()) |
| 1469 flags |= frameOwner->sandboxFlags(); | 1496 flags |= frameOwner->sandboxFlags(); |
| 1470 return flags; | 1497 return flags; |
| 1471 } | 1498 } |
| 1472 | 1499 |
| 1473 } // namespace blink | 1500 } // namespace blink |
| OLD | NEW |