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 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 if (!responseEndTime) | 279 if (!responseEndTime) |
280 responseEndTime = m_timeOfLastDataReceived; | 280 responseEndTime = m_timeOfLastDataReceived; |
281 if (!responseEndTime) | 281 if (!responseEndTime) |
282 responseEndTime = monotonicallyIncreasingTime(); | 282 responseEndTime = monotonicallyIncreasingTime(); |
283 timing()->setResponseEnd(responseEndTime); | 283 timing()->setResponseEnd(responseEndTime); |
284 | 284 |
285 commitIfReady(); | 285 commitIfReady(); |
286 if (!frameLoader()) | 286 if (!frameLoader()) |
287 return; | 287 return; |
288 | 288 |
289 if (isArchiveMIMEType(m_response.mimeType())) { | 289 if (!maybeCreateArchive()) { |
290 createArchive(); | |
291 } else { | |
292 // If this is an empty document, it will not have actually been created
yet. Commit dummy data so that | 290 // If this is an empty document, it will not have actually been created
yet. Commit dummy data so that |
293 // DocumentWriter::begin() gets called and creates the Document. | 291 // DocumentWriter::begin() gets called and creates the Document. |
294 if (!m_writer) | 292 if (!m_writer) |
295 commitData(0, 0); | 293 commitData(0, 0); |
296 } | 294 } |
297 | 295 |
298 endWriting(m_writer.get()); | 296 endWriting(m_writer.get()); |
299 | 297 |
300 if (!m_mainDocumentError.isNull()) | 298 if (!m_mainDocumentError.isNull()) |
301 return; | 299 return; |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
638 if (doc->isDelayingLoadEvent() && !doc->loadEventFinished()) | 636 if (doc->isDelayingLoadEvent() && !doc->loadEventFinished()) |
639 return true; | 637 return true; |
640 if (doc->processingLoadEvent()) | 638 if (doc->processingLoadEvent()) |
641 return true; | 639 return true; |
642 if (doc->hasActiveParser()) | 640 if (doc->hasActiveParser()) |
643 return true; | 641 return true; |
644 } | 642 } |
645 return frameLoader()->subframeIsLoading(); | 643 return frameLoader()->subframeIsLoading(); |
646 } | 644 } |
647 | 645 |
648 void DocumentLoader::createArchive() | 646 bool DocumentLoader::maybeCreateArchive() |
649 { | 647 { |
| 648 // Give the archive machinery a crack at this document. If the MIME type is
not an archive type, it will return 0. |
| 649 if (!isArchiveMIMEType(m_response.mimeType())) |
| 650 return false; |
| 651 |
650 ASSERT(m_mainResource); | 652 ASSERT(m_mainResource); |
651 m_archive = MHTMLArchive::create(m_response.url(), m_mainResource->resourceB
uffer()); | 653 m_archive = MHTMLArchive::create(m_response.url(), m_mainResource->resourceB
uffer()); |
652 RELEASE_ASSERT(m_archive); | 654 // Invalid MHTML. |
| 655 if (!m_archive || !m_archive->mainResource()) { |
| 656 m_archive.clear(); |
| 657 return false; |
| 658 } |
653 | 659 |
654 addAllArchiveResources(m_archive.get()); | 660 addAllArchiveResources(m_archive.get()); |
655 ArchiveResource* mainResource = m_archive->mainResource(); | 661 ArchiveResource* mainResource = m_archive->mainResource(); |
656 | 662 |
657 // The origin is the MHTML file, we need to set the base URL to the document
encoded in the MHTML so | 663 // The origin is the MHTML file, we need to set the base URL to the document
encoded in the MHTML so |
658 // relative URLs are resolved properly. | 664 // relative URLs are resolved properly. |
659 ensureWriter(mainResource->mimeType(), m_archive->mainResource()->url()); | 665 ensureWriter(mainResource->mimeType(), m_archive->mainResource()->url()); |
660 | 666 |
661 commitData(mainResource->data()->data(), mainResource->data()->size()); | 667 commitData(mainResource->data()->data(), mainResource->data()->size()); |
| 668 return true; |
662 } | 669 } |
663 | 670 |
664 void DocumentLoader::addAllArchiveResources(MHTMLArchive* archive) | 671 void DocumentLoader::addAllArchiveResources(MHTMLArchive* archive) |
665 { | 672 { |
666 ASSERT(archive); | 673 ASSERT(archive); |
667 if (!m_archiveResourceCollection) | 674 if (!m_archiveResourceCollection) |
668 m_archiveResourceCollection = adoptPtr(new ArchiveResourceCollection); | 675 m_archiveResourceCollection = adoptPtr(new ArchiveResourceCollection); |
669 m_archiveResourceCollection->addAllResources(archive); | 676 m_archiveResourceCollection->addAllResources(archive); |
670 } | 677 } |
671 | 678 |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
888 void DocumentLoader::replaceDocument(const String& source, Document* ownerDocume
nt) | 895 void DocumentLoader::replaceDocument(const String& source, Document* ownerDocume
nt) |
889 { | 896 { |
890 m_frame->loader().stopAllLoaders(); | 897 m_frame->loader().stopAllLoaders(); |
891 m_writer = createWriterFor(m_frame, ownerDocument, m_frame->document()->url(
), mimeType(), m_writer ? m_writer->encoding() : emptyAtom, m_writer ? m_writer
->encodingWasChosenByUser() : false, true); | 898 m_writer = createWriterFor(m_frame, ownerDocument, m_frame->document()->url(
), mimeType(), m_writer ? m_writer->encoding() : emptyAtom, m_writer ? m_writer
->encodingWasChosenByUser() : false, true); |
892 if (!source.isNull()) | 899 if (!source.isNull()) |
893 m_writer->appendReplacingData(source); | 900 m_writer->appendReplacingData(source); |
894 endWriting(m_writer.get()); | 901 endWriting(m_writer.get()); |
895 } | 902 } |
896 | 903 |
897 } // namespace WebCore | 904 } // namespace WebCore |
OLD | NEW |