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

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

Issue 2751833002: Clean up DocumentWriter creation's FrameLoader interaction (Closed)
Patch Set: Rebase + nits Created 3 years, 9 months 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 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
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
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
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
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/loader/DocumentLoader.h ('k') | third_party/WebKit/Source/core/loader/FrameLoader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698