Chromium Code Reviews| 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 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 75 #include "wtf/TemporaryChange.h" | 75 #include "wtf/TemporaryChange.h" |
| 76 #include "wtf/text/WTFString.h" | 76 #include "wtf/text/WTFString.h" |
| 77 | 77 |
| 78 namespace blink { | 78 namespace blink { |
| 79 | 79 |
| 80 static bool isArchiveMIMEType(const String& mimeType) | 80 static bool isArchiveMIMEType(const String& mimeType) |
| 81 { | 81 { |
| 82 return equalIgnoringCase("multipart/related", mimeType); | 82 return equalIgnoringCase("multipart/related", mimeType); |
| 83 } | 83 } |
| 84 | 84 |
| 85 static bool shouldInheritSecurityOriginFromOwner(const KURL& url) | |
| 86 { | |
| 87 // https://html.spec.whatwg.org/multipage/browsers.html#origin | |
| 88 // | |
| 89 // If a Document is the initial "about:blank" document | |
| 90 // The origin and effective script origin of the Document are those it | |
| 91 // was assigned when its browsing context was created. | |
| 92 // | |
| 93 // Note: We generalize this to all "blank" URLs and invalid URLs because we | |
| 94 // treat all of these URLs as about:blank. | |
| 95 return url.isEmpty() || url.protocolIsAbout(); | |
| 96 } | |
| 97 | |
| 85 DocumentLoader::DocumentLoader(LocalFrame* frame, const ResourceRequest& req, co nst SubstituteData& substituteData) | 98 DocumentLoader::DocumentLoader(LocalFrame* frame, const ResourceRequest& req, co nst SubstituteData& substituteData) |
| 86 : m_frame(frame) | 99 : m_frame(frame) |
| 87 , m_fetcher(FrameFetchContext::createContextAndFetcher(this)) | 100 , m_fetcher(FrameFetchContext::createContextAndFetcher(this)) |
| 88 , m_originalRequest(req) | 101 , m_originalRequest(req) |
| 89 , m_substituteData(substituteData) | 102 , m_substituteData(substituteData) |
| 90 , m_request(req) | 103 , m_request(req) |
| 91 , m_isClientRedirect(false) | 104 , m_isClientRedirect(false) |
| 92 , m_replacesCurrentHistoryItem(false) | 105 , m_replacesCurrentHistoryItem(false) |
| 93 , m_navigationType(NavigationTypeOther) | 106 , m_navigationType(NavigationTypeOther) |
| 94 , m_documentLoadTiming(*this) | 107 , m_documentLoadTiming(*this) |
| (...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 451 | 464 |
| 452 void DocumentLoader::ensureWriter(const AtomicString& mimeType, const KURL& over ridingURL) | 465 void DocumentLoader::ensureWriter(const AtomicString& mimeType, const KURL& over ridingURL) |
| 453 { | 466 { |
| 454 if (m_writer) | 467 if (m_writer) |
| 455 return; | 468 return; |
| 456 | 469 |
| 457 const AtomicString& encoding = m_frame->host()->overrideEncoding().isNull() ? response().textEncodingName() : m_frame->host()->overrideEncoding(); | 470 const AtomicString& encoding = m_frame->host()->overrideEncoding().isNull() ? response().textEncodingName() : m_frame->host()->overrideEncoding(); |
| 458 | 471 |
| 459 // Prepare a DocumentInit before clearing the frame, because it may need to | 472 // Prepare a DocumentInit before clearing the frame, because it may need to |
| 460 // inherit an aliased security context. | 473 // inherit an aliased security context. |
| 461 DocumentInit init(url(), m_frame); | 474 Document* owner = nullptr; |
| 475 // TODO(dcheng): This differs from the behavior of both IE and Firefox: the | |
| 476 // origin is inherited from the document that loaded the URL. | |
| 477 if (shouldInheritSecurityOriginFromOwner(url())) { | |
| 478 Frame* ownerFrame = m_frame->tree().parent(); | |
| 479 if (!ownerFrame) | |
| 480 ownerFrame = m_frame->loader().opener(); | |
| 481 if (ownerFrame && ownerFrame->isLocalFrame()) | |
| 482 owner = toLocalFrame(ownerFrame)->document(); | |
| 483 } | |
| 484 DocumentInit init(owner, url(), m_frame); | |
| 462 init.withNewRegistrationContext(); | 485 init.withNewRegistrationContext(); |
| 463 m_frame->loader().clear(); | 486 m_frame->loader().clear(); |
| 464 ASSERT(m_frame->page()); | 487 ASSERT(m_frame->page()); |
| 465 | 488 |
| 466 ParserSynchronizationPolicy parsingPolicy = AllowAsynchronousParsing; | 489 ParserSynchronizationPolicy parsingPolicy = AllowAsynchronousParsing; |
| 467 if ((m_substituteData.isValid() && m_substituteData.forceSynchronousLoad()) || !Document::threadedParsingEnabledForTesting()) | 490 if ((m_substituteData.isValid() && m_substituteData.forceSynchronousLoad()) || !Document::threadedParsingEnabledForTesting()) |
| 468 parsingPolicy = ForceSynchronousParsing; | 491 parsingPolicy = ForceSynchronousParsing; |
| 469 | 492 |
| 470 m_writer = createWriterFor(0, init, mimeType, encoding, false, parsingPolicy ); | 493 m_writer = createWriterFor(init, mimeType, encoding, false, parsingPolicy); |
| 471 m_writer->setDocumentWasLoadedAsPartOfNavigation(); | 494 m_writer->setDocumentWasLoadedAsPartOfNavigation(); |
| 472 | 495 |
| 473 // This should be set before receivedFirstData(). | 496 // This should be set before receivedFirstData(). |
| 474 if (!overridingURL.isEmpty()) | 497 if (!overridingURL.isEmpty()) |
| 475 m_frame->document()->setBaseURLOverride(overridingURL); | 498 m_frame->document()->setBaseURLOverride(overridingURL); |
| 476 | 499 |
| 477 // Call receivedFirstData() exactly once per load. | 500 // Call receivedFirstData() exactly once per load. |
| 478 frameLoader()->receivedFirstData(); | 501 frameLoader()->receivedFirstData(); |
| 479 m_frame->document()->maybeHandleHttpRefresh(m_response.httpHeaderField(HTTPN ames::Refresh), Document::HttpRefreshFromHeader); | 502 m_frame->document()->maybeHandleHttpRefresh(m_response.httpHeaderField(HTTPN ames::Refresh), Document::HttpRefreshFromHeader); |
| 480 } | 503 } |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 725 m_fetcher->acceptDataFromThreadedReceiver(mainResourceIdentifier(), data, da taLength, encodedDataLength); | 748 m_fetcher->acceptDataFromThreadedReceiver(mainResourceIdentifier(), data, da taLength, encodedDataLength); |
| 726 } | 749 } |
| 727 | 750 |
| 728 void DocumentLoader::endWriting(DocumentWriter* writer) | 751 void DocumentLoader::endWriting(DocumentWriter* writer) |
| 729 { | 752 { |
| 730 ASSERT_UNUSED(writer, m_writer == writer); | 753 ASSERT_UNUSED(writer, m_writer == writer); |
| 731 m_writer->end(); | 754 m_writer->end(); |
| 732 m_writer.clear(); | 755 m_writer.clear(); |
| 733 } | 756 } |
| 734 | 757 |
| 735 PassRefPtrWillBeRawPtr<DocumentWriter> DocumentLoader::createWriterFor(const Doc ument* ownerDocument, const DocumentInit& init, const AtomicString& mimeType, co nst AtomicString& encoding, bool dispatch, ParserSynchronizationPolicy parsingPo licy) | 758 PassRefPtrWillBeRawPtr<DocumentWriter> DocumentLoader::createWriterFor(const Doc umentInit& init, const AtomicString& mimeType, const AtomicString& encoding, boo l dispatch, ParserSynchronizationPolicy parsingPolicy) |
| 736 { | 759 { |
| 737 LocalFrame* frame = init.frame(); | 760 LocalFrame* frame = init.frame(); |
| 738 | 761 |
| 739 ASSERT(!frame->document() || !frame->document()->isActive()); | 762 ASSERT(!frame->document() || !frame->document()->isActive()); |
| 740 ASSERT(frame->tree().childCount() == 0); | 763 ASSERT(frame->tree().childCount() == 0); |
| 741 | 764 |
| 742 if (!init.shouldReuseDefaultView()) | 765 if (!init.shouldReuseDefaultView()) |
| 743 frame->setDOMWindow(LocalDOMWindow::create(*frame)); | 766 frame->setDOMWindow(LocalDOMWindow::create(*frame)); |
| 744 | 767 |
| 745 RefPtrWillBeRawPtr<Document> document = frame->localDOMWindow()->installNewD ocument(mimeType, init); | 768 RefPtrWillBeRawPtr<Document> document = frame->localDOMWindow()->installNewD ocument(mimeType, init); |
|
jochen (gone - plz use gerrit)
2016/02/29 16:37:23
I wonder whether we should RELEASE_ASSERT that we
dcheng
2016/02/29 17:49:23
It's kind of expected that this will normally chan
| |
| 746 if (ownerDocument) { | |
| 747 document->setCookieURL(ownerDocument->cookieURL()); | |
| 748 document->updateSecurityOrigin(ownerDocument->securityOrigin()); | |
| 749 } | |
| 750 | 769 |
| 751 frame->loader().didBeginDocument(dispatch); | 770 frame->loader().didBeginDocument(dispatch); |
| 752 | 771 |
| 753 return DocumentWriter::create(document.get(), parsingPolicy, mimeType, encod ing); | 772 return DocumentWriter::create(document.get(), parsingPolicy, mimeType, encod ing); |
| 754 } | 773 } |
| 755 | 774 |
| 756 const AtomicString& DocumentLoader::mimeType() const | 775 const AtomicString& DocumentLoader::mimeType() const |
| 757 { | 776 { |
| 758 if (m_writer) | 777 if (m_writer) |
| 759 return m_writer->mimeType(); | 778 return m_writer->mimeType(); |
| 760 return m_response.mimeType(); | 779 return m_response.mimeType(); |
| 761 } | 780 } |
| 762 | 781 |
| 763 // This is only called by FrameLoader::replaceDocumentWhileExecutingJavaScriptUR L() | 782 // This is only called by FrameLoader::replaceDocumentWhileExecutingJavaScriptUR L() |
| 764 void DocumentLoader::replaceDocumentWhileExecutingJavaScriptURL(const DocumentIn it& init, const String& source, Document* ownerDocument) | 783 void DocumentLoader::replaceDocumentWhileExecutingJavaScriptURL(const DocumentIn it& init, const String& source) |
| 765 { | 784 { |
| 766 m_writer = createWriterFor(ownerDocument, init, mimeType(), m_writer ? m_wri ter->encoding() : emptyAtom, true, ForceSynchronousParsing); | 785 m_writer = createWriterFor(init, mimeType(), m_writer ? m_writer->encoding() : emptyAtom, true, ForceSynchronousParsing); |
| 767 if (!source.isNull()) | 786 if (!source.isNull()) |
| 768 m_writer->appendReplacingData(source); | 787 m_writer->appendReplacingData(source); |
| 769 endWriting(m_writer.get()); | 788 endWriting(m_writer.get()); |
| 770 } | 789 } |
| 771 | 790 |
| 772 DEFINE_WEAK_IDENTIFIER_MAP(DocumentLoader); | 791 DEFINE_WEAK_IDENTIFIER_MAP(DocumentLoader); |
| 773 | 792 |
| 774 } // namespace blink | 793 } // namespace blink |
| OLD | NEW |