OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. |
3 * Copyright (C) 2011 Google Inc. All rights reserved. | 3 * Copyright (C) 2011 Google Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * | 8 * |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 23 matching lines...) Expand all Loading... |
34 #include "core/dom/WeakIdentifierMap.h" | 34 #include "core/dom/WeakIdentifierMap.h" |
35 #include "core/events/Event.h" | 35 #include "core/events/Event.h" |
36 #include "core/frame/Deprecation.h" | 36 #include "core/frame/Deprecation.h" |
37 #include "core/frame/FrameHost.h" | 37 #include "core/frame/FrameHost.h" |
38 #include "core/frame/LocalDOMWindow.h" | 38 #include "core/frame/LocalDOMWindow.h" |
39 #include "core/frame/LocalFrame.h" | 39 #include "core/frame/LocalFrame.h" |
40 #include "core/frame/LocalFrameClient.h" | 40 #include "core/frame/LocalFrameClient.h" |
41 #include "core/frame/Settings.h" | 41 #include "core/frame/Settings.h" |
42 #include "core/frame/csp/ContentSecurityPolicy.h" | 42 #include "core/frame/csp/ContentSecurityPolicy.h" |
43 #include "core/html/HTMLFrameOwnerElement.h" | 43 #include "core/html/HTMLFrameOwnerElement.h" |
| 44 #include "core/html/parser/HTMLParserIdioms.h" |
44 #include "core/html/parser/TextResourceDecoder.h" | 45 #include "core/html/parser/TextResourceDecoder.h" |
45 #include "core/inspector/ConsoleMessage.h" | 46 #include "core/inspector/ConsoleMessage.h" |
46 #include "core/inspector/InspectorInstrumentation.h" | 47 #include "core/inspector/InspectorInstrumentation.h" |
| 48 #include "core/inspector/InspectorTraceEvents.h" |
47 #include "core/inspector/MainThreadDebugger.h" | 49 #include "core/inspector/MainThreadDebugger.h" |
48 #include "core/loader/FrameFetchContext.h" | 50 #include "core/loader/FrameFetchContext.h" |
49 #include "core/loader/FrameLoader.h" | 51 #include "core/loader/FrameLoader.h" |
50 #include "core/loader/LinkLoader.h" | 52 #include "core/loader/LinkLoader.h" |
51 #include "core/loader/NetworkHintsInterface.h" | 53 #include "core/loader/NetworkHintsInterface.h" |
52 #include "core/loader/ProgressTracker.h" | 54 #include "core/loader/ProgressTracker.h" |
53 #include "core/loader/SubresourceFilter.h" | 55 #include "core/loader/SubresourceFilter.h" |
54 #include "core/loader/appcache/ApplicationCacheHost.h" | 56 #include "core/loader/appcache/ApplicationCacheHost.h" |
55 #include "core/loader/resource/CSSStyleSheetResource.h" | 57 #include "core/loader/resource/CSSStyleSheetResource.h" |
56 #include "core/loader/resource/FontResource.h" | 58 #include "core/loader/resource/FontResource.h" |
57 #include "core/loader/resource/ImageResource.h" | 59 #include "core/loader/resource/ImageResource.h" |
58 #include "core/loader/resource/ScriptResource.h" | 60 #include "core/loader/resource/ScriptResource.h" |
| 61 #include "core/origin_trials/OriginTrialContext.h" |
59 #include "core/page/FrameTree.h" | 62 #include "core/page/FrameTree.h" |
60 #include "core/page/Page.h" | 63 #include "core/page/Page.h" |
61 #include "platform/HTTPNames.h" | 64 #include "platform/HTTPNames.h" |
62 #include "platform/UserGestureIndicator.h" | 65 #include "platform/UserGestureIndicator.h" |
| 66 #include "platform/feature_policy/FeaturePolicy.h" |
63 #include "platform/loader/fetch/FetchInitiatorTypeNames.h" | 67 #include "platform/loader/fetch/FetchInitiatorTypeNames.h" |
64 #include "platform/loader/fetch/FetchRequest.h" | 68 #include "platform/loader/fetch/FetchRequest.h" |
65 #include "platform/loader/fetch/FetchUtils.h" | 69 #include "platform/loader/fetch/FetchUtils.h" |
66 #include "platform/loader/fetch/MemoryCache.h" | 70 #include "platform/loader/fetch/MemoryCache.h" |
67 #include "platform/loader/fetch/ResourceFetcher.h" | 71 #include "platform/loader/fetch/ResourceFetcher.h" |
68 #include "platform/loader/fetch/ResourceTimingInfo.h" | 72 #include "platform/loader/fetch/ResourceTimingInfo.h" |
69 #include "platform/mhtml/ArchiveResource.h" | 73 #include "platform/mhtml/ArchiveResource.h" |
70 #include "platform/network/ContentSecurityPolicyResponseHeaders.h" | 74 #include "platform/network/ContentSecurityPolicyResponseHeaders.h" |
71 #include "platform/network/HTTPParsers.h" | 75 #include "platform/network/HTTPParsers.h" |
72 #include "platform/network/mime/MIMETypeRegistry.h" | 76 #include "platform/network/mime/MIMETypeRegistry.h" |
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
560 DocumentInit init(owner, url(), m_frame); | 564 DocumentInit init(owner, url(), m_frame); |
561 init.withNewRegistrationContext(); | 565 init.withNewRegistrationContext(); |
562 m_frame->loader().clear(); | 566 m_frame->loader().clear(); |
563 DCHECK(m_frame->page()); | 567 DCHECK(m_frame->page()); |
564 | 568 |
565 ParserSynchronizationPolicy parsingPolicy = AllowAsynchronousParsing; | 569 ParserSynchronizationPolicy parsingPolicy = AllowAsynchronousParsing; |
566 if ((m_substituteData.isValid() && m_substituteData.forceSynchronousLoad()) || | 570 if ((m_substituteData.isValid() && m_substituteData.forceSynchronousLoad()) || |
567 !Document::threadedParsingEnabledForTesting()) | 571 !Document::threadedParsingEnabledForTesting()) |
568 parsingPolicy = ForceSynchronousParsing; | 572 parsingPolicy = ForceSynchronousParsing; |
569 | 573 |
570 m_writer = createWriterFor(init, mimeType, encoding, false, parsingPolicy, | 574 installNewDocument(init, mimeType, encoding, |
571 overridingURL); | 575 InstallNewDocumentReason::kNavigation, parsingPolicy, |
| 576 overridingURL); |
572 m_writer->setDocumentWasLoadedAsPartOfNavigation(); | 577 m_writer->setDocumentWasLoadedAsPartOfNavigation(); |
573 m_frame->document()->maybeHandleHttpRefresh( | 578 m_frame->document()->maybeHandleHttpRefresh( |
574 m_response.httpHeaderField(HTTPNames::Refresh), | 579 m_response.httpHeaderField(HTTPNames::Refresh), |
575 Document::HttpRefreshFromHeader); | 580 Document::HttpRefreshFromHeader); |
576 } | 581 } |
577 | 582 |
578 void DocumentLoader::commitData(const char* bytes, size_t length) { | 583 void DocumentLoader::commitData(const char* bytes, size_t length) { |
579 DCHECK_EQ(m_state, Committed); | 584 DCHECK_EQ(m_state, Committed); |
580 ensureWriter(m_response.mimeType()); | 585 ensureWriter(m_response.mimeType()); |
581 | 586 |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
772 m_request = m_mainResource->isLoading() ? m_mainResource->resourceRequest() | 777 m_request = m_mainResource->isLoading() ? m_mainResource->resourceRequest() |
773 : fetchRequest.resourceRequest(); | 778 : fetchRequest.resourceRequest(); |
774 m_mainResource->addClient(this); | 779 m_mainResource->addClient(this); |
775 } | 780 } |
776 | 781 |
777 void DocumentLoader::endWriting() { | 782 void DocumentLoader::endWriting() { |
778 m_writer->end(); | 783 m_writer->end(); |
779 m_writer.clear(); | 784 m_writer.clear(); |
780 } | 785 } |
781 | 786 |
782 DocumentWriter* DocumentLoader::createWriterFor( | 787 void DocumentLoader::didInstallNewDocument(Document* document) { |
| 788 document->setReadyState(Document::Loading); |
| 789 document->initContentSecurityPolicy(m_contentSecurityPolicy.release()); |
| 790 |
| 791 frameLoader().didInstallNewDocument(); |
| 792 |
| 793 String suboriginHeader = m_response.httpHeaderField(HTTPNames::Suborigin); |
| 794 if (!suboriginHeader.isNull()) { |
| 795 Vector<String> messages; |
| 796 Suborigin suborigin; |
| 797 if (parseSuboriginHeader(suboriginHeader, &suborigin, messages)) |
| 798 document->enforceSuborigin(suborigin); |
| 799 |
| 800 for (auto& message : messages) { |
| 801 document->addConsoleMessage( |
| 802 ConsoleMessage::create(SecurityMessageSource, ErrorMessageLevel, |
| 803 "Error with Suborigin header: " + message)); |
| 804 } |
| 805 } |
| 806 |
| 807 document->clientHintsPreferences().updateFrom(m_clientHintsPreferences); |
| 808 |
| 809 // TODO(japhet): There's no reason to wait until commit to set these bits. |
| 810 Settings* settings = document->settings(); |
| 811 m_fetcher->setImagesEnabled(settings->getImagesEnabled()); |
| 812 m_fetcher->setAutoLoadImages(settings->getLoadsImagesAutomatically()); |
| 813 |
| 814 const AtomicString& dnsPrefetchControl = |
| 815 m_response.httpHeaderField(HTTPNames::X_DNS_Prefetch_Control); |
| 816 if (!dnsPrefetchControl.isEmpty()) |
| 817 document->parseDNSPrefetchControlHeader(dnsPrefetchControl); |
| 818 |
| 819 String headerContentLanguage = |
| 820 m_response.httpHeaderField(HTTPNames::Content_Language); |
| 821 if (!headerContentLanguage.isEmpty()) { |
| 822 size_t commaIndex = headerContentLanguage.find(','); |
| 823 // kNotFound == -1 == don't truncate |
| 824 headerContentLanguage.truncate(commaIndex); |
| 825 headerContentLanguage = |
| 826 headerContentLanguage.stripWhiteSpace(isHTMLSpace<UChar>); |
| 827 if (!headerContentLanguage.isEmpty()) |
| 828 document->setContentLanguage(AtomicString(headerContentLanguage)); |
| 829 } |
| 830 |
| 831 OriginTrialContext::addTokensFromHeader( |
| 832 document, m_response.httpHeaderField(HTTPNames::Origin_Trial)); |
| 833 String referrerPolicyHeader = |
| 834 m_response.httpHeaderField(HTTPNames::Referrer_Policy); |
| 835 if (!referrerPolicyHeader.isNull()) { |
| 836 UseCounter::count(*document, UseCounter::ReferrerPolicyHeader); |
| 837 document->parseAndSetReferrerPolicy(referrerPolicyHeader); |
| 838 } |
| 839 |
| 840 localFrameClient().didCreateNewDocument(); |
| 841 } |
| 842 |
| 843 void DocumentLoader::didCommitNavigation() { |
| 844 if (frameLoader().stateMachine()->creatingInitialEmptyDocument()) |
| 845 return; |
| 846 frameLoader().receivedFirstData(); |
| 847 |
| 848 // didObserveLoadingBehavior() must be called after dispatchDidCommitLoad() is |
| 849 // called for the metrics tracking logic to handle it properly. |
| 850 if (m_serviceWorkerNetworkProvider && |
| 851 m_serviceWorkerNetworkProvider->isControlledByServiceWorker()) { |
| 852 localFrameClient().didObserveLoadingBehavior( |
| 853 WebLoadingBehaviorServiceWorkerControlled); |
| 854 } |
| 855 |
| 856 // Links with media values need more information (like viewport information). |
| 857 // This happens after the first chunk is parsed in HTMLDocumentParser. |
| 858 dispatchLinkHeaderPreloads(nullptr, LinkLoader::OnlyLoadNonMedia); |
| 859 |
| 860 TRACE_EVENT1("devtools.timeline", "CommitLoad", "data", |
| 861 InspectorCommitLoadEvent::data(m_frame)); |
| 862 probe::didCommitLoad(m_frame, this); |
| 863 m_frame->page()->didCommitLoad(m_frame); |
| 864 } |
| 865 |
| 866 void setFeaturePolicy(Document* document, const String& featurePolicyHeader) { |
| 867 if (!RuntimeEnabledFeatures::featurePolicyEnabled()) |
| 868 return; |
| 869 LocalFrame* frame = document->frame(); |
| 870 WebFeaturePolicy* parentFeaturePolicy = |
| 871 frame->isMainFrame() |
| 872 ? nullptr |
| 873 : frame->tree().parent()->securityContext()->getFeaturePolicy(); |
| 874 Vector<String> messages; |
| 875 const WebParsedFeaturePolicy& parsedHeader = parseFeaturePolicy( |
| 876 featurePolicyHeader, frame->securityContext()->getSecurityOrigin(), |
| 877 &messages); |
| 878 WebParsedFeaturePolicy containerPolicy; |
| 879 if (frame->owner()) { |
| 880 containerPolicy = getContainerPolicyFromAllowedFeatures( |
| 881 frame->owner()->allowedFeatures(), |
| 882 frame->securityContext()->getSecurityOrigin()); |
| 883 } |
| 884 frame->securityContext()->initializeFeaturePolicy( |
| 885 parsedHeader, containerPolicy, parentFeaturePolicy); |
| 886 |
| 887 for (auto& message : messages) { |
| 888 document->addConsoleMessage( |
| 889 ConsoleMessage::create(OtherMessageSource, ErrorMessageLevel, |
| 890 "Error with Feature-Policy header: " + message)); |
| 891 } |
| 892 if (!parsedHeader.isEmpty()) |
| 893 frame->client()->didSetFeaturePolicyHeader(parsedHeader); |
| 894 } |
| 895 |
| 896 void DocumentLoader::installNewDocument( |
783 const DocumentInit& init, | 897 const DocumentInit& init, |
784 const AtomicString& mimeType, | 898 const AtomicString& mimeType, |
785 const AtomicString& encoding, | 899 const AtomicString& encoding, |
786 bool dispatchWindowObjectAvailable, | 900 InstallNewDocumentReason reason, |
787 ParserSynchronizationPolicy parsingPolicy, | 901 ParserSynchronizationPolicy parsingPolicy, |
788 const KURL& overridingURL) { | 902 const KURL& overridingURL) { |
789 LocalFrame* frame = init.frame(); | 903 DCHECK_EQ(init.frame(), m_frame); |
790 | 904 DCHECK(!m_frame->document() || !m_frame->document()->isActive()); |
791 DCHECK(!frame->document() || !frame->document()->isActive()); | 905 DCHECK_EQ(m_frame->tree().childCount(), 0u); |
792 DCHECK_EQ(frame->tree().childCount(), 0u); | |
793 | 906 |
794 if (!init.shouldReuseDefaultView()) | 907 if (!init.shouldReuseDefaultView()) |
795 frame->setDOMWindow(LocalDOMWindow::create(*frame)); | 908 m_frame->setDOMWindow(LocalDOMWindow::create(*m_frame)); |
796 | 909 |
797 Document* document = frame->domWindow()->installNewDocument(mimeType, init); | 910 Document* document = m_frame->domWindow()->installNewDocument(mimeType, init); |
798 | 911 m_frame->page()->chromeClient().installSupplements(*m_frame); |
799 frame->page()->chromeClient().installSupplements(*frame); | |
800 | |
801 // This should be set before receivedFirstData(). | |
802 if (!overridingURL.isEmpty()) | 912 if (!overridingURL.isEmpty()) |
803 frame->document()->setBaseURLOverride(overridingURL); | 913 document->setBaseURLOverride(overridingURL); |
804 | 914 didInstallNewDocument(document); |
805 frame->loader().didInstallNewDocument(dispatchWindowObjectAvailable); | |
806 | 915 |
807 // This must be called before DocumentWriter is created, otherwise HTML parser | 916 // This must be called before DocumentWriter is created, otherwise HTML parser |
808 // will use stale values from HTMLParserOption. | 917 // will use stale values from HTMLParserOption. |
809 if (!dispatchWindowObjectAvailable) | 918 if (reason == InstallNewDocumentReason::kNavigation) |
810 frame->loader().receivedFirstData(); | 919 didCommitNavigation(); |
811 | 920 |
812 frame->loader().didBeginDocument(); | 921 m_writer = |
| 922 DocumentWriter::create(document, parsingPolicy, mimeType, encoding); |
813 | 923 |
814 return DocumentWriter::create(document, parsingPolicy, mimeType, encoding); | 924 // FeaturePolicy is reset in the browser process on commit, so this needs to |
| 925 // be initialized and replicated to the browser process after commit messages |
| 926 // are sent in didCommitNavigation(). |
| 927 setFeaturePolicy(document, |
| 928 m_response.httpHeaderField(HTTPNames::Feature_Policy)); |
| 929 frameLoader().dispatchDidClearDocumentOfWindowObject(); |
815 } | 930 } |
816 | 931 |
817 const AtomicString& DocumentLoader::mimeType() const { | 932 const AtomicString& DocumentLoader::mimeType() const { |
818 if (m_writer) | 933 if (m_writer) |
819 return m_writer->mimeType(); | 934 return m_writer->mimeType(); |
820 return m_response.mimeType(); | 935 return m_response.mimeType(); |
821 } | 936 } |
822 | 937 |
823 // This is only called by | 938 // This is only called by |
824 // FrameLoader::replaceDocumentWhileExecutingJavaScriptURL() | 939 // FrameLoader::replaceDocumentWhileExecutingJavaScriptURL() |
825 void DocumentLoader::replaceDocumentWhileExecutingJavaScriptURL( | 940 void DocumentLoader::replaceDocumentWhileExecutingJavaScriptURL( |
826 const DocumentInit& init, | 941 const DocumentInit& init, |
827 const String& source) { | 942 const String& source) { |
828 m_writer = createWriterFor(init, mimeType(), | 943 installNewDocument(init, mimeType(), |
829 m_writer ? m_writer->encoding() : emptyAtom, true, | 944 m_writer ? m_writer->encoding() : emptyAtom, |
830 ForceSynchronousParsing); | 945 InstallNewDocumentReason::kJavascriptURL, |
| 946 ForceSynchronousParsing, KURL()); |
831 if (!source.isNull()) | 947 if (!source.isNull()) |
832 m_writer->appendReplacingData(source); | 948 m_writer->appendReplacingData(source); |
833 endWriting(); | 949 endWriting(); |
834 } | 950 } |
835 | 951 |
836 DEFINE_WEAK_IDENTIFIER_MAP(DocumentLoader); | 952 DEFINE_WEAK_IDENTIFIER_MAP(DocumentLoader); |
837 | 953 |
838 } // namespace blink | 954 } // namespace blink |
OLD | NEW |