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 485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 } | 496 } |
497 } | 497 } |
498 } | 498 } |
499 | 499 |
500 void DocumentLoader::ensureWriter(const AtomicString& mimeType, const KURL& over
ridingURL) | 500 void DocumentLoader::ensureWriter(const AtomicString& mimeType, const KURL& over
ridingURL) |
501 { | 501 { |
502 if (m_writer) | 502 if (m_writer) |
503 return; | 503 return; |
504 | 504 |
505 const AtomicString& encoding = overrideEncoding().isNull() ? response().text
EncodingName() : overrideEncoding(); | 505 const AtomicString& encoding = overrideEncoding().isNull() ? response().text
EncodingName() : overrideEncoding(); |
506 m_writer = createWriterFor(m_frame, 0, url(), mimeType, encoding, false); | 506 |
| 507 // Prepare a DocumentInit before clearing the frame, because it may need to |
| 508 // inherit an aliased security context. |
| 509 DocumentInit init(url(), m_frame); |
| 510 init.withNewRegistrationContext(); |
| 511 m_frame->loader().clear(); |
| 512 ASSERT(m_frame->page()); |
| 513 |
| 514 m_writer = createWriterFor(0, init, mimeType, encoding, false); |
507 m_writer->setDocumentWasLoadedAsPartOfNavigation(); | 515 m_writer->setDocumentWasLoadedAsPartOfNavigation(); |
508 // This should be set before receivedFirstData(). | 516 // This should be set before receivedFirstData(). |
509 if (!overridingURL.isEmpty()) | 517 if (!overridingURL.isEmpty()) |
510 m_frame->document()->setBaseURLOverride(overridingURL); | 518 m_frame->document()->setBaseURLOverride(overridingURL); |
511 | 519 |
512 // Call receivedFirstData() exactly once per load. | 520 // Call receivedFirstData() exactly once per load. |
513 frameLoader()->receivedFirstData(); | 521 frameLoader()->receivedFirstData(); |
514 m_frame->document()->maybeHandleHttpRefresh(m_response.httpHeaderField("Refr
esh"), Document::HttpRefreshFromHeader); | 522 m_frame->document()->maybeHandleHttpRefresh(m_response.httpHeaderField("Refr
esh"), Document::HttpRefreshFromHeader); |
515 } | 523 } |
516 | 524 |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
769 mainResourceLoader()->attachThreadedDataReceiver(threadedDataReceiver); | 777 mainResourceLoader()->attachThreadedDataReceiver(threadedDataReceiver); |
770 } | 778 } |
771 | 779 |
772 void DocumentLoader::endWriting(DocumentWriter* writer) | 780 void DocumentLoader::endWriting(DocumentWriter* writer) |
773 { | 781 { |
774 ASSERT_UNUSED(writer, m_writer == writer); | 782 ASSERT_UNUSED(writer, m_writer == writer); |
775 m_writer->end(); | 783 m_writer->end(); |
776 m_writer.clear(); | 784 m_writer.clear(); |
777 } | 785 } |
778 | 786 |
779 PassRefPtrWillBeRawPtr<DocumentWriter> DocumentLoader::createWriterFor(LocalFram
e* frame, const Document* ownerDocument, const KURL& url, const AtomicString& mi
meType, const AtomicString& encoding, bool dispatch) | 787 PassRefPtrWillBeRawPtr<DocumentWriter> DocumentLoader::createWriterFor(const Doc
ument* ownerDocument, const DocumentInit& init, const AtomicString& mimeType, co
nst AtomicString& encoding, bool dispatch) |
780 { | 788 { |
781 // Create a new document before clearing the frame, because it may need to | 789 LocalFrame* frame = init.frame(); |
782 // inherit an aliased security context. | |
783 DocumentInit init(url, frame); | |
784 init.withNewRegistrationContext(); | |
785 | |
786 // In some rare cases, we'll re-used a LocalDOMWindow for a new Document. Fo
r example, | |
787 // when a script calls window.open("..."), the browser gives JavaScript a wi
ndow | |
788 // synchronously but kicks off the load in the window asynchronously. Web si
tes | |
789 // expect that modifications that they make to the window object synchronous
ly | |
790 // won't be blown away when the network load commits. To make that happen, w
e | |
791 // "securely transition" the existing LocalDOMWindow to the Document that re
sults from | |
792 // the network load. See also SecurityContext::isSecureTransitionTo. | |
793 bool shouldReuseDefaultView = frame->loader().stateMachine()->isDisplayingIn
itialEmptyDocument() && frame->document()->isSecureTransitionTo(url); | |
794 | |
795 frame->loader().clear(); | |
796 | 790 |
797 if (frame->document()) | 791 if (frame->document()) |
798 frame->document()->prepareForDestruction(); | 792 frame->document()->prepareForDestruction(); |
799 | 793 |
800 if (!shouldReuseDefaultView) | 794 if (!init.shouldReuseDefaultView()) |
801 frame->setDOMWindow(LocalDOMWindow::create(*frame)); | 795 frame->setDOMWindow(LocalDOMWindow::create(*frame)); |
802 | 796 |
803 RefPtrWillBeRawPtr<Document> document = frame->domWindow()->installNewDocume
nt(mimeType, init); | 797 RefPtrWillBeRawPtr<Document> document = frame->domWindow()->installNewDocume
nt(mimeType, init); |
804 if (ownerDocument) { | 798 if (ownerDocument) { |
805 document->setCookieURL(ownerDocument->cookieURL()); | 799 document->setCookieURL(ownerDocument->cookieURL()); |
806 document->setSecurityOrigin(ownerDocument->securityOrigin()); | 800 document->setSecurityOrigin(ownerDocument->securityOrigin()); |
807 if (ownerDocument->isTransitionDocument()) | 801 if (ownerDocument->isTransitionDocument()) |
808 document->setIsTransitionDocument(); | 802 document->setIsTransitionDocument(); |
809 } | 803 } |
810 | 804 |
811 frame->loader().didBeginDocument(dispatch); | 805 frame->loader().didBeginDocument(dispatch); |
812 | 806 |
813 return DocumentWriter::create(document.get(), mimeType, encoding); | 807 return DocumentWriter::create(document.get(), mimeType, encoding); |
814 } | 808 } |
815 | 809 |
816 const AtomicString& DocumentLoader::mimeType() const | 810 const AtomicString& DocumentLoader::mimeType() const |
817 { | 811 { |
818 if (m_writer) | 812 if (m_writer) |
819 return m_writer->mimeType(); | 813 return m_writer->mimeType(); |
820 return m_response.mimeType(); | 814 return m_response.mimeType(); |
821 } | 815 } |
822 | 816 |
823 void DocumentLoader::setUserChosenEncoding(const String& charset) | 817 void DocumentLoader::setUserChosenEncoding(const String& charset) |
824 { | 818 { |
825 if (m_writer) | 819 if (m_writer) |
826 m_writer->setUserChosenEncoding(charset); | 820 m_writer->setUserChosenEncoding(charset); |
827 } | 821 } |
828 | 822 |
829 // This is only called by ScriptController::executeScriptIfJavaScriptURL | 823 // This is only called by FrameLoader::replaceDocumentWhileExecutingJavaScriptUR
L() |
830 // and always contains the result of evaluating a javascript: url. | 824 void DocumentLoader::replaceDocumentWhileExecutingJavaScriptURL(const DocumentIn
it& init, const String& source, Document* ownerDocument) |
831 // This is the <iframe src="javascript:'html'"> case. | |
832 void DocumentLoader::replaceDocument(const String& source, Document* ownerDocume
nt) | |
833 { | 825 { |
834 m_frame->loader().stopAllLoaders(); | 826 m_writer = createWriterFor(ownerDocument, init, mimeType(), m_writer ? m_wri
ter->encoding() : emptyAtom, true); |
835 m_writer = createWriterFor(m_frame, ownerDocument, m_frame->document()->url(
), mimeType(), m_writer ? m_writer->encoding() : emptyAtom, true); | |
836 if (!source.isNull()) | 827 if (!source.isNull()) |
837 m_writer->appendReplacingData(source); | 828 m_writer->appendReplacingData(source); |
838 endWriting(m_writer.get()); | 829 endWriting(m_writer.get()); |
839 } | 830 } |
840 | 831 |
841 } // namespace blink | 832 } // namespace blink |
OLD | NEW |