| Index: third_party/WebKit/Source/core/loader/DocumentLoader.cpp
|
| diff --git a/third_party/WebKit/Source/core/loader/DocumentLoader.cpp b/third_party/WebKit/Source/core/loader/DocumentLoader.cpp
|
| index 06af2d1d7d8b7e1aee84cf7dfcb37995e6d4e5ec..9c49e713fba7d86df1e289cd2a2e39200ec2ef95 100644
|
| --- a/third_party/WebKit/Source/core/loader/DocumentLoader.cpp
|
| +++ b/third_party/WebKit/Source/core/loader/DocumentLoader.cpp
|
| @@ -115,16 +115,28 @@ DocumentLoader::DocumentLoader(LocalFrame* frame,
|
| m_state(NotStarted),
|
| m_inDataReceived(false),
|
| m_dataBuffer(SharedBuffer::create()) {
|
| + DCHECK(m_frame);
|
| +
|
| // The document URL needs to be added to the head of the list as that is
|
| // where the redirects originated.
|
| if (m_isClientRedirect)
|
| appendRedirect(m_frame->document()->url());
|
| }
|
|
|
| -FrameLoader* DocumentLoader::frameLoader() const {
|
| - if (!m_frame)
|
| - return nullptr;
|
| - return &m_frame->loader();
|
| +FrameLoader& DocumentLoader::frameLoader() const {
|
| + DCHECK(m_frame);
|
| + return m_frame->loader();
|
| +}
|
| +
|
| +FrameLoaderClient* DocumentLoader::frameLoaderClient() const {
|
| + DCHECK(m_frame);
|
| + FrameLoaderClient* client = m_frame->client();
|
| + // LocalFrame clears its |m_client| only after detaching all DocumentLoaders
|
| + // (i.e. calls detachFromFrame() which clears |m_frame|) owned by the
|
| + // LocalFrame's FrameLoader. So, if |m_frame| is non nullptr, |client| is
|
| + // also non nullptr.
|
| + DCHECK(client);
|
| + return client;
|
| }
|
|
|
| DocumentLoader::~DocumentLoader() {
|
| @@ -219,8 +231,7 @@ void DocumentLoader::didRedirect(const KURL& oldURL, const KURL& newURL) {
|
| // If a redirection happens during a back/forward navigation, don't restore
|
| // any state from the old HistoryItem. There is a provisional history item for
|
| // back/forward navigation only. In the other case, clearing it is a no-op.
|
| - DCHECK(frameLoader());
|
| - frameLoader()->clearProvisionalHistoryItem();
|
| + frameLoader().clearProvisionalHistoryItem();
|
| }
|
|
|
| void DocumentLoader::dispatchLinkHeaderPreloads(
|
| @@ -233,16 +244,16 @@ void DocumentLoader::dispatchLinkHeaderPreloads(
|
| }
|
|
|
| void DocumentLoader::didChangePerformanceTiming() {
|
| - if (frame() && frame()->isMainFrame() && m_state >= Committed) {
|
| - frameLoader()->client()->didChangePerformanceTiming();
|
| + if (m_frame && m_frame->isMainFrame() && m_state >= Committed) {
|
| + frameLoaderClient()->didChangePerformanceTiming();
|
| }
|
| }
|
|
|
| void DocumentLoader::didObserveLoadingBehavior(
|
| WebLoadingBehaviorFlag behavior) {
|
| - if (frame() && frame()->isMainFrame()) {
|
| + if (m_frame && m_frame->isMainFrame()) {
|
| DCHECK_GE(m_state, Committed);
|
| - frameLoader()->client()->didObserveLoadingBehavior(behavior);
|
| + frameLoaderClient()->didObserveLoadingBehavior(behavior);
|
| }
|
| }
|
|
|
| @@ -269,7 +280,7 @@ const KURL& DocumentLoader::urlForHistory() const {
|
| void DocumentLoader::commitIfReady() {
|
| if (m_state < Committed) {
|
| m_state = Committed;
|
| - frameLoader()->commitProvisionalLoad();
|
| + frameLoader().commitProvisionalLoad();
|
| }
|
| }
|
|
|
| @@ -285,7 +296,7 @@ void DocumentLoader::notifyFinished(Resource* resource) {
|
| if (m_applicationCacheHost)
|
| m_applicationCacheHost->failedLoadingMainResource();
|
| m_state = MainResourceDone;
|
| - frameLoader()->loadFailed(this, m_mainResource->resourceError());
|
| + frameLoader().loadFailed(this, m_mainResource->resourceError());
|
| clearMainResourceHandle();
|
| }
|
|
|
| @@ -302,7 +313,7 @@ void DocumentLoader::finishedLoading(double finishTime) {
|
| timing().setResponseEnd(responseEndTime);
|
|
|
| commitIfReady();
|
| - if (!frameLoader())
|
| + if (!m_frame)
|
| return;
|
|
|
| if (!maybeCreateArchive()) {
|
| @@ -327,6 +338,7 @@ bool DocumentLoader::redirectReceived(
|
| Resource* resource,
|
| const ResourceRequest& request,
|
| const ResourceResponse& redirectResponse) {
|
| + DCHECK(m_frame);
|
| DCHECK_EQ(resource, m_mainResource);
|
| DCHECK(!redirectResponse.isNull());
|
| m_request = request;
|
| @@ -341,7 +353,7 @@ bool DocumentLoader::redirectReceived(
|
| m_fetcher->stopFetching();
|
| return false;
|
| }
|
| - if (!frameLoader()->shouldContinueForNavigationPolicy(
|
| + if (!frameLoader().shouldContinueForNavigationPolicy(
|
| m_request, SubstituteData(), this, CheckContentSecurityPolicy,
|
| m_navigationType, NavigationPolicyCurrentTab,
|
| replacesCurrentHistoryItem(), isClientRedirect(), nullptr)) {
|
| @@ -352,7 +364,7 @@ bool DocumentLoader::redirectReceived(
|
| DCHECK(timing().fetchStart());
|
| appendRedirect(requestURL);
|
| didRedirect(redirectResponse.url(), requestURL);
|
| - frameLoader()->client()->dispatchDidReceiveServerRedirectForProvisionalLoad();
|
| + frameLoaderClient()->dispatchDidReceiveServerRedirectForProvisionalLoad();
|
|
|
| return true;
|
| }
|
| @@ -419,7 +431,7 @@ void DocumentLoader::responseReceived(
|
| std::unique_ptr<WebDataConsumerHandle> handle) {
|
| DCHECK_EQ(m_mainResource, resource);
|
| DCHECK(!handle);
|
| - DCHECK(frame());
|
| + DCHECK(m_frame);
|
|
|
| m_applicationCacheHost->didReceiveResponseForMainResource(response);
|
|
|
| @@ -446,7 +458,7 @@ void DocumentLoader::responseReceived(
|
| response.httpHeaderFields().find(HTTPNames::X_Frame_Options);
|
| if (it != response.httpHeaderFields().end()) {
|
| String content = it->value;
|
| - if (frameLoader()->shouldInterruptLoadForXFrameOptions(
|
| + if (frameLoader().shouldInterruptLoadForXFrameOptions(
|
| content, response.url(), mainResourceIdentifier())) {
|
| String message = "Refused to display '" +
|
| response.url().elidedString() +
|
| @@ -455,7 +467,7 @@ void DocumentLoader::responseReceived(
|
| ConsoleMessage* consoleMessage = ConsoleMessage::createForRequest(
|
| SecurityMessageSource, ErrorMessageLevel, message, response.url(),
|
| mainResourceIdentifier());
|
| - frame()->document()->addConsoleMessage(consoleMessage);
|
| + m_frame->document()->addConsoleMessage(consoleMessage);
|
|
|
| cancelLoadAfterXFrameOptionsOrCSPDenied(response);
|
| return;
|
| @@ -464,29 +476,29 @@ void DocumentLoader::responseReceived(
|
| }
|
|
|
| if (RuntimeEnabledFeatures::embedderCSPEnforcementEnabled() &&
|
| - !frameLoader()->requiredCSP().isEmpty()) {
|
| + !frameLoader().requiredCSP().isEmpty()) {
|
| SecurityOrigin* parentSecurityOrigin =
|
| - frame()->tree().parent()->securityContext()->getSecurityOrigin();
|
| + m_frame->tree().parent()->securityContext()->getSecurityOrigin();
|
| if (ContentSecurityPolicy::shouldEnforceEmbeddersPolicy(
|
| response, parentSecurityOrigin)) {
|
| m_contentSecurityPolicy->addPolicyFromHeaderValue(
|
| - frameLoader()->requiredCSP(), ContentSecurityPolicyHeaderTypeEnforce,
|
| + frameLoader().requiredCSP(), ContentSecurityPolicyHeaderTypeEnforce,
|
| ContentSecurityPolicyHeaderSourceHTTP);
|
| } else {
|
| ContentSecurityPolicy* embeddingCSP = ContentSecurityPolicy::create();
|
| embeddingCSP->addPolicyFromHeaderValue(
|
| - frameLoader()->requiredCSP(), ContentSecurityPolicyHeaderTypeEnforce,
|
| + frameLoader().requiredCSP(), ContentSecurityPolicyHeaderTypeEnforce,
|
| ContentSecurityPolicyHeaderSourceHTTP);
|
| if (!embeddingCSP->subsumes(*m_contentSecurityPolicy)) {
|
| String message = "Refused to display '" +
|
| response.url().elidedString() +
|
| "' because it has not opted-into the following policy "
|
| "required by its embedder: '" +
|
| - frameLoader()->requiredCSP() + "'.";
|
| + frameLoader().requiredCSP() + "'.";
|
| ConsoleMessage* consoleMessage = ConsoleMessage::createForRequest(
|
| SecurityMessageSource, ErrorMessageLevel, message, response.url(),
|
| mainResourceIdentifier());
|
| - frame()->document()->addConsoleMessage(consoleMessage);
|
| + m_frame->document()->addConsoleMessage(consoleMessage);
|
| cancelLoadAfterXFrameOptionsOrCSPDenied(response);
|
| return;
|
| }
|
| @@ -611,7 +623,7 @@ void DocumentLoader::processData(const char* data, size_t length) {
|
| if (isArchiveMIMEType(response().mimeType()))
|
| return;
|
| commitIfReady();
|
| - if (!frameLoader())
|
| + if (!m_frame)
|
| return;
|
| commitData(data, length);
|
|
|
| @@ -695,7 +707,7 @@ bool DocumentLoader::maybeLoadEmpty() {
|
| return false;
|
|
|
| if (m_request.url().isEmpty() &&
|
| - !frameLoader()->stateMachine()->creatingInitialEmptyDocument())
|
| + !frameLoader().stateMachine()->creatingInitialEmptyDocument())
|
| m_request.setURL(blankURL());
|
| m_response =
|
| ResourceResponse(m_request.url(), "text/html", 0, nullAtom, String());
|
|
|