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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 { | 80 { |
81 return equalIgnoringCase("multipart/related", mimeType); | 81 return equalIgnoringCase("multipart/related", mimeType); |
82 } | 82 } |
83 | 83 |
84 DocumentLoader::DocumentLoader(LocalFrame* frame, const ResourceRequest& req, co
nst SubstituteData& substituteData) | 84 DocumentLoader::DocumentLoader(LocalFrame* frame, const ResourceRequest& req, co
nst SubstituteData& substituteData) |
85 : m_frame(frame) | 85 : m_frame(frame) |
86 , m_fetcher(FrameFetchContext::createContextAndFetcher(this)) | 86 , m_fetcher(FrameFetchContext::createContextAndFetcher(this)) |
87 , m_originalRequest(req) | 87 , m_originalRequest(req) |
88 , m_substituteData(substituteData) | 88 , m_substituteData(substituteData) |
89 , m_request(req) | 89 , m_request(req) |
90 , m_committed(false) | |
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_loadingMainResource(false) | |
95 , m_timeOfLastDataReceived(0.0) | 93 , m_timeOfLastDataReceived(0.0) |
96 , m_applicationCacheHost(ApplicationCacheHost::create(this)) | 94 , m_applicationCacheHost(ApplicationCacheHost::create(this)) |
| 95 , m_state(NotStarted) |
97 { | 96 { |
98 } | 97 } |
99 | 98 |
100 FrameLoader* DocumentLoader::frameLoader() const | 99 FrameLoader* DocumentLoader::frameLoader() const |
101 { | 100 { |
102 if (!m_frame) | 101 if (!m_frame) |
103 return nullptr; | 102 return nullptr; |
104 return &m_frame->loader(); | 103 return &m_frame->loader(); |
105 } | 104 } |
106 | 105 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 | 197 |
199 void DocumentLoader::mainReceivedError(const ResourceError& error) | 198 void DocumentLoader::mainReceivedError(const ResourceError& error) |
200 { | 199 { |
201 ASSERT(!error.isNull()); | 200 ASSERT(!error.isNull()); |
202 ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading() || In
spectorInstrumentation::isDebuggerPaused(m_frame)); | 201 ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading() || In
spectorInstrumentation::isDebuggerPaused(m_frame)); |
203 if (m_applicationCacheHost) | 202 if (m_applicationCacheHost) |
204 m_applicationCacheHost->failedLoadingMainResource(); | 203 m_applicationCacheHost->failedLoadingMainResource(); |
205 if (!frameLoader()) | 204 if (!frameLoader()) |
206 return; | 205 return; |
207 m_mainDocumentError = error; | 206 m_mainDocumentError = error; |
208 clearMainResourceLoader(); | 207 m_state = MainResourceDone; |
209 frameLoader()->receivedMainResourceError(this, error); | 208 frameLoader()->receivedMainResourceError(this, error); |
210 clearMainResourceHandle(); | 209 clearMainResourceHandle(); |
211 } | 210 } |
212 | 211 |
213 // Cancels the data source's pending loads. Conceptually, a data source only lo
ads | 212 // Cancels the data source's pending loads. Conceptually, a data source only lo
ads |
214 // one document at a time, but one document may have many related resources. | 213 // one document at a time, but one document may have many related resources. |
215 // stopLoading will stop all loads initiated by the data source, | 214 // stopLoading will stop all loads initiated by the data source, |
216 // but not loads initiated by child frames' data sources -- that's the WebFrame'
s job. | 215 // but not loads initiated by child frames' data sources -- that's the WebFrame'
s job. |
217 void DocumentLoader::stopLoading() | 216 void DocumentLoader::stopLoading() |
218 { | 217 { |
219 RefPtrWillBeRawPtr<LocalFrame> protectFrame(m_frame.get()); | 218 RefPtrWillBeRawPtr<LocalFrame> protectFrame(m_frame.get()); |
220 RefPtrWillBeRawPtr<DocumentLoader> protectLoader(this); | 219 RefPtrWillBeRawPtr<DocumentLoader> protectLoader(this); |
221 | 220 |
222 if (isLoading()) | 221 if (isLoading()) |
223 cancelMainResourceLoad(ResourceError::cancelledError(m_request.url())); | 222 cancelMainResourceLoad(ResourceError::cancelledError(m_request.url())); |
224 m_fetcher->stopFetching(); | 223 m_fetcher->stopFetching(); |
225 } | 224 } |
226 | 225 |
227 void DocumentLoader::commitIfReady() | 226 void DocumentLoader::commitIfReady() |
228 { | 227 { |
229 if (!m_committed) { | 228 if (m_state < Committed) { |
230 m_committed = true; | 229 m_state = Committed; |
231 frameLoader()->commitProvisionalLoad(); | 230 frameLoader()->commitProvisionalLoad(); |
232 } | 231 } |
233 } | 232 } |
234 | 233 |
235 bool DocumentLoader::isLoading() const | 234 bool DocumentLoader::isLoading() const |
236 { | 235 { |
237 if (document() && document()->hasActiveParser()) | 236 if (document() && document()->hasActiveParser()) |
238 return true; | 237 return true; |
239 | 238 |
240 return m_loadingMainResource || m_fetcher->isFetching(); | 239 return (m_state > NotStarted && m_state < MainResourceDone) || m_fetcher->is
Fetching(); |
241 } | 240 } |
242 | 241 |
243 void DocumentLoader::notifyFinished(Resource* resource) | 242 void DocumentLoader::notifyFinished(Resource* resource) |
244 { | 243 { |
245 ASSERT_UNUSED(resource, m_mainResource == resource); | 244 ASSERT_UNUSED(resource, m_mainResource == resource); |
246 ASSERT(m_mainResource); | 245 ASSERT(m_mainResource); |
247 | 246 |
248 RefPtrWillBeRawPtr<DocumentLoader> protect(this); | 247 RefPtrWillBeRawPtr<DocumentLoader> protect(this); |
249 | 248 |
250 if (!m_mainResource->errorOccurred() && !m_mainResource->wasCanceled()) { | 249 if (!m_mainResource->errorOccurred() && !m_mainResource->wasCanceled()) { |
(...skipping 25 matching lines...) Expand all Loading... |
276 // If this is an empty document, it will not have actually been created
yet. Commit dummy data so that | 275 // If this is an empty document, it will not have actually been created
yet. Commit dummy data so that |
277 // DocumentWriter::begin() gets called and creates the Document. | 276 // DocumentWriter::begin() gets called and creates the Document. |
278 if (!m_writer) | 277 if (!m_writer) |
279 commitData(0, 0); | 278 commitData(0, 0); |
280 } | 279 } |
281 | 280 |
282 endWriting(m_writer.get()); | 281 endWriting(m_writer.get()); |
283 | 282 |
284 if (!m_mainDocumentError.isNull()) | 283 if (!m_mainDocumentError.isNull()) |
285 return; | 284 return; |
286 clearMainResourceLoader(); | 285 m_state = MainResourceDone; |
287 | 286 |
288 // If the document specified an application cache manifest, it violates the
author's intent if we store it in the memory cache | 287 // If the document specified an application cache manifest, it violates the
author's intent if we store it in the memory cache |
289 // and deny the appcache the chance to intercept it in the future, so remove
from the memory cache. | 288 // and deny the appcache the chance to intercept it in the future, so remove
from the memory cache. |
290 if (m_frame) { | 289 if (m_frame) { |
291 if (m_mainResource && m_frame->document()->hasAppCacheManifest()) | 290 if (m_mainResource && m_frame->document()->hasAppCacheManifest()) |
292 memoryCache()->remove(m_mainResource.get()); | 291 memoryCache()->remove(m_mainResource.get()); |
293 } | 292 } |
294 m_applicationCacheHost->finishedLoadingMainResource(); | 293 m_applicationCacheHost->finishedLoadingMainResource(); |
295 clearMainResourceHandle(); | 294 clearMainResourceHandle(); |
296 } | 295 } |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
523 if (!overridingURL.isEmpty()) | 522 if (!overridingURL.isEmpty()) |
524 m_frame->document()->setBaseURLOverride(overridingURL); | 523 m_frame->document()->setBaseURLOverride(overridingURL); |
525 | 524 |
526 // Call receivedFirstData() exactly once per load. | 525 // Call receivedFirstData() exactly once per load. |
527 frameLoader()->receivedFirstData(); | 526 frameLoader()->receivedFirstData(); |
528 m_frame->document()->maybeHandleHttpRefresh(m_response.httpHeaderField("Refr
esh"), Document::HttpRefreshFromHeader); | 527 m_frame->document()->maybeHandleHttpRefresh(m_response.httpHeaderField("Refr
esh"), Document::HttpRefreshFromHeader); |
529 } | 528 } |
530 | 529 |
531 void DocumentLoader::commitData(const char* bytes, size_t length) | 530 void DocumentLoader::commitData(const char* bytes, size_t length) |
532 { | 531 { |
| 532 ASSERT(m_state < MainResourceDone); |
533 ensureWriter(m_response.mimeType()); | 533 ensureWriter(m_response.mimeType()); |
534 | 534 |
535 // This can happen if document.close() is called by an event handler while | 535 // This can happen if document.close() is called by an event handler while |
536 // there's still pending incoming data. | 536 // there's still pending incoming data. |
537 if (m_frame && !m_frame->document()->parsing()) { | 537 if (m_frame && !m_frame->document()->parsing()) { |
538 cancelMainResourceLoad(ResourceError::cancelledError(m_request.url())); | 538 cancelMainResourceLoad(ResourceError::cancelledError(m_request.url())); |
539 return; | 539 return; |
540 } | 540 } |
541 | 541 |
| 542 if (length) |
| 543 m_state = DataReceived; |
| 544 |
542 m_writer->addData(bytes, length); | 545 m_writer->addData(bytes, length); |
543 } | 546 } |
544 | 547 |
545 void DocumentLoader::dataReceived(Resource* resource, const char* data, unsigned
length) | 548 void DocumentLoader::dataReceived(Resource* resource, const char* data, unsigned
length) |
546 { | 549 { |
547 ASSERT(data); | 550 ASSERT(data); |
548 ASSERT(length); | 551 ASSERT(length); |
549 ASSERT_UNUSED(resource, resource == m_mainResource); | 552 ASSERT_UNUSED(resource, resource == m_mainResource); |
550 ASSERT(!m_response.isNull()); | 553 ASSERT(!m_response.isNull()); |
551 ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); | 554 ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
603 | 606 |
604 m_fetcher->clearContext(); | 607 m_fetcher->clearContext(); |
605 | 608 |
606 m_applicationCacheHost->detachFromDocumentLoader(); | 609 m_applicationCacheHost->detachFromDocumentLoader(); |
607 m_applicationCacheHost.clear(); | 610 m_applicationCacheHost.clear(); |
608 WeakIdentifierMap<DocumentLoader>::notifyObjectDestroyed(this); | 611 WeakIdentifierMap<DocumentLoader>::notifyObjectDestroyed(this); |
609 clearMainResourceHandle(); | 612 clearMainResourceHandle(); |
610 m_frame = nullptr; | 613 m_frame = nullptr; |
611 } | 614 } |
612 | 615 |
613 void DocumentLoader::clearMainResourceLoader() | |
614 { | |
615 m_loadingMainResource = false; | |
616 } | |
617 | |
618 void DocumentLoader::clearMainResourceHandle() | 616 void DocumentLoader::clearMainResourceHandle() |
619 { | 617 { |
620 if (!m_mainResource) | 618 if (!m_mainResource) |
621 return; | 619 return; |
622 m_mainResource->removeClient(this); | 620 m_mainResource->removeClient(this); |
623 m_mainResource = nullptr; | 621 m_mainResource = nullptr; |
624 } | 622 } |
625 | 623 |
626 bool DocumentLoader::maybeCreateArchive() | 624 bool DocumentLoader::maybeCreateArchive() |
627 { | 625 { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
707 finishedLoading(monotonicallyIncreasingTime()); | 705 finishedLoading(monotonicallyIncreasingTime()); |
708 return true; | 706 return true; |
709 } | 707 } |
710 | 708 |
711 void DocumentLoader::startLoadingMainResource() | 709 void DocumentLoader::startLoadingMainResource() |
712 { | 710 { |
713 RefPtrWillBeRawPtr<DocumentLoader> protect(this); | 711 RefPtrWillBeRawPtr<DocumentLoader> protect(this); |
714 m_mainDocumentError = ResourceError(); | 712 m_mainDocumentError = ResourceError(); |
715 timing().markNavigationStart(); | 713 timing().markNavigationStart(); |
716 ASSERT(!m_mainResource); | 714 ASSERT(!m_mainResource); |
717 ASSERT(!m_loadingMainResource); | 715 ASSERT(m_state == NotStarted); |
718 m_loadingMainResource = true; | 716 m_state = Provisional; |
719 | 717 |
720 if (maybeLoadEmpty()) | 718 if (maybeLoadEmpty()) |
721 return; | 719 return; |
722 | 720 |
723 ASSERT(timing().navigationStart()); | 721 ASSERT(timing().navigationStart()); |
724 ASSERT(!timing().fetchStart()); | 722 ASSERT(!timing().fetchStart()); |
725 timing().markFetchStart(); | 723 timing().markFetchStart(); |
726 willSendRequest(m_request, ResourceResponse()); | 724 willSendRequest(m_request, ResourceResponse()); |
727 | 725 |
728 // willSendRequest() may lead to our LocalFrame being detached or cancelling
the load via nulling the ResourceRequest. | 726 // willSendRequest() may lead to our LocalFrame being detached or cancelling
the load via nulling the ResourceRequest. |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
822 { | 820 { |
823 m_writer = createWriterFor(ownerDocument, init, mimeType(), m_writer ? m_wri
ter->encoding() : emptyAtom, true, ForceSynchronousParsing); | 821 m_writer = createWriterFor(ownerDocument, init, mimeType(), m_writer ? m_wri
ter->encoding() : emptyAtom, true, ForceSynchronousParsing); |
824 if (!source.isNull()) | 822 if (!source.isNull()) |
825 m_writer->appendReplacingData(source); | 823 m_writer->appendReplacingData(source); |
826 endWriting(m_writer.get()); | 824 endWriting(m_writer.get()); |
827 } | 825 } |
828 | 826 |
829 DEFINE_WEAK_IDENTIFIER_MAP(DocumentLoader); | 827 DEFINE_WEAK_IDENTIFIER_MAP(DocumentLoader); |
830 | 828 |
831 } // namespace blink | 829 } // namespace blink |
OLD | NEW |