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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 #include "platform/mhtml/ArchiveResource.h" | 65 #include "platform/mhtml/ArchiveResource.h" |
66 #include "platform/mhtml/ArchiveResourceCollection.h" | 66 #include "platform/mhtml/ArchiveResourceCollection.h" |
67 #include "platform/mhtml/MHTMLArchive.h" | 67 #include "platform/mhtml/MHTMLArchive.h" |
68 #include "platform/network/ContentSecurityPolicyResponseHeaders.h" | 68 #include "platform/network/ContentSecurityPolicyResponseHeaders.h" |
69 #include "platform/plugins/PluginData.h" | 69 #include "platform/plugins/PluginData.h" |
70 #include "platform/weborigin/SchemeRegistry.h" | 70 #include "platform/weborigin/SchemeRegistry.h" |
71 #include "platform/weborigin/SecurityPolicy.h" | 71 #include "platform/weborigin/SecurityPolicy.h" |
72 #include "public/platform/Platform.h" | 72 #include "public/platform/Platform.h" |
73 #include "public/platform/WebMimeRegistry.h" | 73 #include "public/platform/WebMimeRegistry.h" |
74 #include "wtf/Assertions.h" | 74 #include "wtf/Assertions.h" |
75 #include "wtf/TemporaryChange.h" | |
76 #include "wtf/text/WTFString.h" | 75 #include "wtf/text/WTFString.h" |
77 | 76 |
78 namespace blink { | 77 namespace blink { |
79 | 78 |
80 static bool isArchiveMIMEType(const String& mimeType) | 79 static bool isArchiveMIMEType(const String& mimeType) |
81 { | 80 { |
82 return equalIgnoringCase("multipart/related", mimeType); | 81 return equalIgnoringCase("multipart/related", mimeType); |
83 } | 82 } |
84 | 83 |
85 DocumentLoader::DocumentLoader(LocalFrame* frame, const ResourceRequest& req, co
nst SubstituteData& substituteData) | 84 DocumentLoader::DocumentLoader(LocalFrame* frame, const ResourceRequest& req, co
nst SubstituteData& substituteData) |
86 : m_frame(frame) | 85 : m_frame(frame) |
87 , m_fetcher(FrameFetchContext::createContextAndFetcher(this)) | 86 , m_fetcher(FrameFetchContext::createContextAndFetcher(this)) |
88 , m_originalRequest(req) | 87 , m_originalRequest(req) |
89 , m_substituteData(substituteData) | 88 , m_substituteData(substituteData) |
90 , m_request(req) | 89 , m_request(req) |
91 , m_isClientRedirect(false) | 90 , m_isClientRedirect(false) |
92 , m_replacesCurrentHistoryItem(false) | 91 , m_replacesCurrentHistoryItem(false) |
93 , m_navigationType(NavigationTypeOther) | 92 , m_navigationType(NavigationTypeOther) |
94 , m_timeOfLastDataReceived(0.0) | 93 , m_timeOfLastDataReceived(0.0) |
95 , m_applicationCacheHost(ApplicationCacheHost::create(this)) | 94 , m_applicationCacheHost(ApplicationCacheHost::create(this)) |
96 , m_state(NotStarted) | 95 , m_state(NotStarted) |
97 , m_inDataReceived(false) | |
98 , m_dataBuffer(SharedBuffer::create()) | |
99 { | 96 { |
100 } | 97 } |
101 | 98 |
102 FrameLoader* DocumentLoader::frameLoader() const | 99 FrameLoader* DocumentLoader::frameLoader() const |
103 { | 100 { |
104 if (!m_frame) | 101 if (!m_frame) |
105 return nullptr; | 102 return nullptr; |
106 return &m_frame->loader(); | 103 return &m_frame->loader(); |
107 } | 104 } |
108 | 105 |
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
550 } | 547 } |
551 | 548 |
552 void DocumentLoader::dataReceived(Resource* resource, const char* data, unsigned
length) | 549 void DocumentLoader::dataReceived(Resource* resource, const char* data, unsigned
length) |
553 { | 550 { |
554 ASSERT(data); | 551 ASSERT(data); |
555 ASSERT(length); | 552 ASSERT(length); |
556 ASSERT_UNUSED(resource, resource == m_mainResource); | 553 ASSERT_UNUSED(resource, resource == m_mainResource); |
557 ASSERT(!m_response.isNull()); | 554 ASSERT(!m_response.isNull()); |
558 ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); | 555 ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); |
559 | 556 |
560 if (m_inDataReceived) { | |
561 // If this function is reentered, defer processing of the additional | |
562 // data to the top-level invocation. Reentrant calls can occur because | |
563 // of web platform (mis-)features that require running a nested message | |
564 // loop: | |
565 // - alert(), confirm(), prompt() | |
566 // - Detach of plugin elements. | |
567 // - Synchronous XMLHTTPRequest | |
568 m_dataBuffer->append(data, length); | |
569 return; | |
570 } | |
571 TemporaryChange<bool> reentrancyProtector(m_inDataReceived, true); | |
572 | |
573 // Both unloading the old page and parsing the new page may execute JavaScri
pt which destroys the datasource | 557 // Both unloading the old page and parsing the new page may execute JavaScri
pt which destroys the datasource |
574 // by starting a new load, so retain temporarily. | 558 // by starting a new load, so retain temporarily. |
575 RefPtrWillBeRawPtr<LocalFrame> protectFrame(m_frame.get()); | 559 RefPtrWillBeRawPtr<LocalFrame> protectFrame(m_frame.get()); |
576 RefPtrWillBeRawPtr<DocumentLoader> protectLoader(this); | 560 RefPtrWillBeRawPtr<DocumentLoader> protectLoader(this); |
577 | 561 |
578 processData(data, length); | |
579 | |
580 // Process data received in reentrant invocations. Note that the | |
581 // invocations of processData() may queue more data in reentrant | |
582 // invocations, so iterate until it's empty. | |
583 const char* segment; | |
584 unsigned pos = 0; | |
585 while (unsigned length = m_dataBuffer->getSomeData(segment, pos)) { | |
586 processData(segment, length); | |
587 pos += length; | |
588 } | |
589 // All data has been consumed, so flush the buffer. | |
590 m_dataBuffer->clear(); | |
591 } | |
592 | |
593 void DocumentLoader::processData(const char* data, unsigned length) | |
594 { | |
595 m_applicationCacheHost->mainResourceDataReceived(data, length); | 562 m_applicationCacheHost->mainResourceDataReceived(data, length); |
596 m_timeOfLastDataReceived = monotonicallyIncreasingTime(); | 563 m_timeOfLastDataReceived = monotonicallyIncreasingTime(); |
597 | 564 |
598 if (isArchiveMIMEType(response().mimeType())) | 565 if (isArchiveMIMEType(response().mimeType())) |
599 return; | 566 return; |
600 commitIfReady(); | 567 commitIfReady(); |
601 if (!frameLoader()) | 568 if (!frameLoader()) |
602 return; | 569 return; |
603 commitData(data, length); | 570 commitData(data, length); |
604 | 571 |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
854 { | 821 { |
855 m_writer = createWriterFor(ownerDocument, init, mimeType(), m_writer ? m_wri
ter->encoding() : emptyAtom, true, ForceSynchronousParsing); | 822 m_writer = createWriterFor(ownerDocument, init, mimeType(), m_writer ? m_wri
ter->encoding() : emptyAtom, true, ForceSynchronousParsing); |
856 if (!source.isNull()) | 823 if (!source.isNull()) |
857 m_writer->appendReplacingData(source); | 824 m_writer->appendReplacingData(source); |
858 endWriting(m_writer.get()); | 825 endWriting(m_writer.get()); |
859 } | 826 } |
860 | 827 |
861 DEFINE_WEAK_IDENTIFIER_MAP(DocumentLoader); | 828 DEFINE_WEAK_IDENTIFIER_MAP(DocumentLoader); |
862 | 829 |
863 } // namespace blink | 830 } // namespace blink |
OLD | NEW |