| 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 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 return m_request; | 159 return m_request; |
| 160 } | 160 } |
| 161 | 161 |
| 162 const KURL& DocumentLoader::url() const | 162 const KURL& DocumentLoader::url() const |
| 163 { | 163 { |
| 164 return m_request.url(); | 164 return m_request.url(); |
| 165 } | 165 } |
| 166 | 166 |
| 167 Resource* DocumentLoader::startPreload(Resource::Type type, FetchRequest& reques
t) | 167 Resource* DocumentLoader::startPreload(Resource::Type type, FetchRequest& reques
t) |
| 168 { | 168 { |
| 169 RefPtrWillBeRawPtr<Resource> resource = nullptr; | 169 RawPtr<Resource> resource = nullptr; |
| 170 switch (type) { | 170 switch (type) { |
| 171 case Resource::Image: | 171 case Resource::Image: |
| 172 resource = ImageResource::fetch(request, fetcher()); | 172 resource = ImageResource::fetch(request, fetcher()); |
| 173 break; | 173 break; |
| 174 case Resource::Script: | 174 case Resource::Script: |
| 175 resource = ScriptResource::fetch(request, fetcher()); | 175 resource = ScriptResource::fetch(request, fetcher()); |
| 176 break; | 176 break; |
| 177 case Resource::CSSStyleSheet: | 177 case Resource::CSSStyleSheet: |
| 178 resource = CSSStyleSheetResource::fetch(request, fetcher()); | 178 resource = CSSStyleSheetResource::fetch(request, fetcher()); |
| 179 break; | 179 break; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 m_state = Committed; | 236 m_state = Committed; |
| 237 frameLoader()->commitProvisionalLoad(); | 237 frameLoader()->commitProvisionalLoad(); |
| 238 } | 238 } |
| 239 } | 239 } |
| 240 | 240 |
| 241 void DocumentLoader::notifyFinished(Resource* resource) | 241 void DocumentLoader::notifyFinished(Resource* resource) |
| 242 { | 242 { |
| 243 ASSERT_UNUSED(resource, m_mainResource == resource); | 243 ASSERT_UNUSED(resource, m_mainResource == resource); |
| 244 ASSERT(m_mainResource); | 244 ASSERT(m_mainResource); |
| 245 | 245 |
| 246 RefPtrWillBeRawPtr<DocumentLoader> protect(this); | 246 RawPtr<DocumentLoader> protect(this); |
| 247 | 247 |
| 248 if (!m_mainResource->errorOccurred() && !m_mainResource->wasCanceled()) { | 248 if (!m_mainResource->errorOccurred() && !m_mainResource->wasCanceled()) { |
| 249 finishedLoading(m_mainResource->loadFinishTime()); | 249 finishedLoading(m_mainResource->loadFinishTime()); |
| 250 return; | 250 return; |
| 251 } | 251 } |
| 252 | 252 |
| 253 if (m_applicationCacheHost) | 253 if (m_applicationCacheHost) |
| 254 m_applicationCacheHost->failedLoadingMainResource(); | 254 m_applicationCacheHost->failedLoadingMainResource(); |
| 255 m_state = MainResourceDone; | 255 m_state = MainResourceDone; |
| 256 frameLoader()->loadFailed(this, m_mainResource->resourceError()); | 256 frameLoader()->loadFailed(this, m_mainResource->resourceError()); |
| 257 clearMainResourceHandle(); | 257 clearMainResourceHandle(); |
| 258 } | 258 } |
| 259 | 259 |
| 260 void DocumentLoader::finishedLoading(double finishTime) | 260 void DocumentLoader::finishedLoading(double finishTime) |
| 261 { | 261 { |
| 262 ASSERT(!m_frame->page()->defersLoading() || InspectorInstrumentation::isDebu
ggerPaused(m_frame)); | 262 ASSERT(!m_frame->page()->defersLoading() || InspectorInstrumentation::isDebu
ggerPaused(m_frame)); |
| 263 | 263 |
| 264 RefPtrWillBeRawPtr<DocumentLoader> protect(this); | 264 RawPtr<DocumentLoader> protect(this); |
| 265 | 265 |
| 266 double responseEndTime = finishTime; | 266 double responseEndTime = finishTime; |
| 267 if (!responseEndTime) | 267 if (!responseEndTime) |
| 268 responseEndTime = m_timeOfLastDataReceived; | 268 responseEndTime = m_timeOfLastDataReceived; |
| 269 if (!responseEndTime) | 269 if (!responseEndTime) |
| 270 responseEndTime = monotonicallyIncreasingTime(); | 270 responseEndTime = monotonicallyIncreasingTime(); |
| 271 timing().setResponseEnd(responseEndTime); | 271 timing().setResponseEnd(responseEndTime); |
| 272 | 272 |
| 273 commitIfReady(); | 273 commitIfReady(); |
| 274 if (!frameLoader()) | 274 if (!frameLoader()) |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 m_response = ResourceResponse(blankURL(), "text/html", 0, nullAtom, String()
); | 359 m_response = ResourceResponse(blankURL(), "text/html", 0, nullAtom, String()
); |
| 360 finishedLoading(monotonicallyIncreasingTime()); | 360 finishedLoading(monotonicallyIncreasingTime()); |
| 361 | 361 |
| 362 return; | 362 return; |
| 363 } | 363 } |
| 364 | 364 |
| 365 void DocumentLoader::responseReceived(Resource* resource, const ResourceResponse
& response, PassOwnPtr<WebDataConsumerHandle> handle) | 365 void DocumentLoader::responseReceived(Resource* resource, const ResourceResponse
& response, PassOwnPtr<WebDataConsumerHandle> handle) |
| 366 { | 366 { |
| 367 ASSERT_UNUSED(resource, m_mainResource == resource); | 367 ASSERT_UNUSED(resource, m_mainResource == resource); |
| 368 ASSERT_UNUSED(handle, !handle); | 368 ASSERT_UNUSED(handle, !handle); |
| 369 RefPtrWillBeRawPtr<DocumentLoader> protect(this); | 369 RawPtr<DocumentLoader> protect(this); |
| 370 ASSERT(frame()); | 370 ASSERT(frame()); |
| 371 | 371 |
| 372 m_applicationCacheHost->didReceiveResponseForMainResource(response); | 372 m_applicationCacheHost->didReceiveResponseForMainResource(response); |
| 373 | 373 |
| 374 // The memory cache doesn't understand the application cache or its caching
rules. So if a main resource is served | 374 // The memory cache doesn't understand the application cache or its caching
rules. So if a main resource is served |
| 375 // from the application cache, ensure we don't save the result for future us
e. All responses loaded | 375 // from the application cache, ensure we don't save the result for future us
e. All responses loaded |
| 376 // from appcache will have a non-zero appCacheID(). | 376 // from appcache will have a non-zero appCacheID(). |
| 377 if (response.appCacheID()) | 377 if (response.appCacheID()) |
| 378 memoryCache()->remove(m_mainResource.get()); | 378 memoryCache()->remove(m_mainResource.get()); |
| 379 | 379 |
| 380 m_contentSecurityPolicy = ContentSecurityPolicy::create(); | 380 m_contentSecurityPolicy = ContentSecurityPolicy::create(); |
| 381 m_contentSecurityPolicy->setOverrideURLForSelf(response.url()); | 381 m_contentSecurityPolicy->setOverrideURLForSelf(response.url()); |
| 382 m_contentSecurityPolicy->didReceiveHeaders(ContentSecurityPolicyResponseHead
ers(response)); | 382 m_contentSecurityPolicy->didReceiveHeaders(ContentSecurityPolicyResponseHead
ers(response)); |
| 383 if (!m_contentSecurityPolicy->allowAncestors(m_frame, response.url())) { | 383 if (!m_contentSecurityPolicy->allowAncestors(m_frame, response.url())) { |
| 384 cancelLoadAfterXFrameOptionsOrCSPDenied(response); | 384 cancelLoadAfterXFrameOptionsOrCSPDenied(response); |
| 385 return; | 385 return; |
| 386 } | 386 } |
| 387 | 387 |
| 388 // 'frame-ancestors' obviates 'x-frame-options': https://w3c.github.io/webap
psec/specs/content-security-policy/#frame-ancestors-and-frame-options | 388 // 'frame-ancestors' obviates 'x-frame-options': https://w3c.github.io/webap
psec/specs/content-security-policy/#frame-ancestors-and-frame-options |
| 389 if (!m_contentSecurityPolicy->isFrameAncestorsEnforced()) { | 389 if (!m_contentSecurityPolicy->isFrameAncestorsEnforced()) { |
| 390 HTTPHeaderMap::const_iterator it = response.httpHeaderFields().find(HTTP
Names::X_Frame_Options); | 390 HTTPHeaderMap::const_iterator it = response.httpHeaderFields().find(HTTP
Names::X_Frame_Options); |
| 391 if (it != response.httpHeaderFields().end()) { | 391 if (it != response.httpHeaderFields().end()) { |
| 392 String content = it->value; | 392 String content = it->value; |
| 393 if (frameLoader()->shouldInterruptLoadForXFrameOptions(content, resp
onse.url(), mainResourceIdentifier())) { | 393 if (frameLoader()->shouldInterruptLoadForXFrameOptions(content, resp
onse.url(), mainResourceIdentifier())) { |
| 394 String message = "Refused to display '" + response.url().elidedS
tring() + "' in a frame because it set 'X-Frame-Options' to '" + content + "'."; | 394 String message = "Refused to display '" + response.url().elidedS
tring() + "' in a frame because it set 'X-Frame-Options' to '" + content + "'."; |
| 395 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessa
ge::create(SecurityMessageSource, ErrorMessageLevel, message); | 395 RawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(S
ecurityMessageSource, ErrorMessageLevel, message); |
| 396 consoleMessage->setRequestIdentifier(mainResourceIdentifier()); | 396 consoleMessage->setRequestIdentifier(mainResourceIdentifier()); |
| 397 frame()->document()->addConsoleMessage(consoleMessage.release())
; | 397 frame()->document()->addConsoleMessage(consoleMessage.release())
; |
| 398 | 398 |
| 399 cancelLoadAfterXFrameOptionsOrCSPDenied(response); | 399 cancelLoadAfterXFrameOptionsOrCSPDenied(response); |
| 400 return; | 400 return; |
| 401 } | 401 } |
| 402 } | 402 } |
| 403 } | 403 } |
| 404 | 404 |
| 405 ASSERT(!m_frame->page()->defersLoading()); | 405 ASSERT(!m_frame->page()->defersLoading()); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 // loop: | 493 // loop: |
| 494 // - alert(), confirm(), prompt() | 494 // - alert(), confirm(), prompt() |
| 495 // - Detach of plugin elements. | 495 // - Detach of plugin elements. |
| 496 // - Synchronous XMLHTTPRequest | 496 // - Synchronous XMLHTTPRequest |
| 497 m_dataBuffer->append(data, length); | 497 m_dataBuffer->append(data, length); |
| 498 return; | 498 return; |
| 499 } | 499 } |
| 500 | 500 |
| 501 // Both unloading the old page and parsing the new page may execute JavaScri
pt which destroys the datasource | 501 // Both unloading the old page and parsing the new page may execute JavaScri
pt which destroys the datasource |
| 502 // by starting a new load, so retain temporarily. | 502 // by starting a new load, so retain temporarily. |
| 503 RefPtrWillBeRawPtr<LocalFrame> protectFrame(m_frame.get()); | 503 RawPtr<LocalFrame> protectFrame(m_frame.get()); |
| 504 RefPtrWillBeRawPtr<DocumentLoader> protectLoader(this); | 504 RawPtr<DocumentLoader> protectLoader(this); |
| 505 | 505 |
| 506 TemporaryChange<bool> reentrancyProtector(m_inDataReceived, true); | 506 TemporaryChange<bool> reentrancyProtector(m_inDataReceived, true); |
| 507 processData(data, length); | 507 processData(data, length); |
| 508 | 508 |
| 509 // Process data received in reentrant invocations. Note that the | 509 // Process data received in reentrant invocations. Note that the |
| 510 // invocations of processData() may queue more data in reentrant | 510 // invocations of processData() may queue more data in reentrant |
| 511 // invocations, so iterate until it's empty. | 511 // invocations, so iterate until it's empty. |
| 512 const char* segment; | 512 const char* segment; |
| 513 size_t pos = 0; | 513 size_t pos = 0; |
| 514 while (size_t length = m_dataBuffer->getSomeData(segment, pos)) { | 514 while (size_t length = m_dataBuffer->getSomeData(segment, pos)) { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 543 } | 543 } |
| 544 | 544 |
| 545 void DocumentLoader::appendRedirect(const KURL& url) | 545 void DocumentLoader::appendRedirect(const KURL& url) |
| 546 { | 546 { |
| 547 m_redirectChain.append(url); | 547 m_redirectChain.append(url); |
| 548 } | 548 } |
| 549 | 549 |
| 550 void DocumentLoader::detachFromFrame() | 550 void DocumentLoader::detachFromFrame() |
| 551 { | 551 { |
| 552 ASSERT(m_frame); | 552 ASSERT(m_frame); |
| 553 RefPtrWillBeRawPtr<LocalFrame> protectFrame(m_frame.get()); | 553 RawPtr<LocalFrame> protectFrame(m_frame.get()); |
| 554 RefPtrWillBeRawPtr<DocumentLoader> protectLoader(this); | 554 RawPtr<DocumentLoader> protectLoader(this); |
| 555 | 555 |
| 556 // It never makes sense to have a document loader that is detached from its | 556 // It never makes sense to have a document loader that is detached from its |
| 557 // frame have any loads active, so go ahead and kill all the loads. | 557 // frame have any loads active, so go ahead and kill all the loads. |
| 558 m_fetcher->stopFetching(); | 558 m_fetcher->stopFetching(); |
| 559 | 559 |
| 560 // If that load cancellation triggered another detach, leave. | 560 // If that load cancellation triggered another detach, leave. |
| 561 // (fast/frames/detach-frame-nested-no-crash.html is an example of this.) | 561 // (fast/frames/detach-frame-nested-no-crash.html is an example of this.) |
| 562 if (!m_frame) | 562 if (!m_frame) |
| 563 return; | 563 return; |
| 564 | 564 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 617 | 617 |
| 618 if (m_request.url().isEmpty() && !frameLoader()->stateMachine()->creatingIni
tialEmptyDocument()) | 618 if (m_request.url().isEmpty() && !frameLoader()->stateMachine()->creatingIni
tialEmptyDocument()) |
| 619 m_request.setURL(blankURL()); | 619 m_request.setURL(blankURL()); |
| 620 m_response = ResourceResponse(m_request.url(), "text/html", 0, nullAtom, Str
ing()); | 620 m_response = ResourceResponse(m_request.url(), "text/html", 0, nullAtom, Str
ing()); |
| 621 finishedLoading(monotonicallyIncreasingTime()); | 621 finishedLoading(monotonicallyIncreasingTime()); |
| 622 return true; | 622 return true; |
| 623 } | 623 } |
| 624 | 624 |
| 625 void DocumentLoader::startLoadingMainResource() | 625 void DocumentLoader::startLoadingMainResource() |
| 626 { | 626 { |
| 627 RefPtrWillBeRawPtr<DocumentLoader> protect(this); | 627 RawPtr<DocumentLoader> protect(this); |
| 628 timing().markNavigationStart(); | 628 timing().markNavigationStart(); |
| 629 ASSERT(!m_mainResource); | 629 ASSERT(!m_mainResource); |
| 630 ASSERT(m_state == NotStarted); | 630 ASSERT(m_state == NotStarted); |
| 631 m_state = Provisional; | 631 m_state = Provisional; |
| 632 | 632 |
| 633 if (maybeLoadEmpty()) | 633 if (maybeLoadEmpty()) |
| 634 return; | 634 return; |
| 635 | 635 |
| 636 ASSERT(timing().navigationStart()); | 636 ASSERT(timing().navigationStart()); |
| 637 ASSERT(!timing().fetchStart()); | 637 ASSERT(!timing().fetchStart()); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 664 m_mainResource->addClient(this); | 664 m_mainResource->addClient(this); |
| 665 } | 665 } |
| 666 | 666 |
| 667 void DocumentLoader::endWriting(DocumentWriter* writer) | 667 void DocumentLoader::endWriting(DocumentWriter* writer) |
| 668 { | 668 { |
| 669 ASSERT_UNUSED(writer, m_writer == writer); | 669 ASSERT_UNUSED(writer, m_writer == writer); |
| 670 m_writer->end(); | 670 m_writer->end(); |
| 671 m_writer.clear(); | 671 m_writer.clear(); |
| 672 } | 672 } |
| 673 | 673 |
| 674 PassRefPtrWillBeRawPtr<DocumentWriter> DocumentLoader::createWriterFor(const Doc
umentInit& init, const AtomicString& mimeType, const AtomicString& encoding, boo
l dispatch, ParserSynchronizationPolicy parsingPolicy) | 674 RawPtr<DocumentWriter> DocumentLoader::createWriterFor(const DocumentInit& init,
const AtomicString& mimeType, const AtomicString& encoding, bool dispatch, Pars
erSynchronizationPolicy parsingPolicy) |
| 675 { | 675 { |
| 676 LocalFrame* frame = init.frame(); | 676 LocalFrame* frame = init.frame(); |
| 677 | 677 |
| 678 ASSERT(!frame->document() || !frame->document()->isActive()); | 678 ASSERT(!frame->document() || !frame->document()->isActive()); |
| 679 ASSERT(frame->tree().childCount() == 0); | 679 ASSERT(frame->tree().childCount() == 0); |
| 680 | 680 |
| 681 if (!init.shouldReuseDefaultView()) | 681 if (!init.shouldReuseDefaultView()) |
| 682 frame->setDOMWindow(LocalDOMWindow::create(*frame)); | 682 frame->setDOMWindow(LocalDOMWindow::create(*frame)); |
| 683 | 683 |
| 684 RefPtrWillBeRawPtr<Document> document = frame->localDOMWindow()->installNewD
ocument(mimeType, init); | 684 RawPtr<Document> document = frame->localDOMWindow()->installNewDocument(mime
Type, init); |
| 685 | 685 |
| 686 frame->loader().didBeginDocument(dispatch); | 686 frame->loader().didBeginDocument(dispatch); |
| 687 | 687 |
| 688 return DocumentWriter::create(document.get(), parsingPolicy, mimeType, encod
ing); | 688 return DocumentWriter::create(document.get(), parsingPolicy, mimeType, encod
ing); |
| 689 } | 689 } |
| 690 | 690 |
| 691 const AtomicString& DocumentLoader::mimeType() const | 691 const AtomicString& DocumentLoader::mimeType() const |
| 692 { | 692 { |
| 693 if (m_writer) | 693 if (m_writer) |
| 694 return m_writer->mimeType(); | 694 return m_writer->mimeType(); |
| 695 return m_response.mimeType(); | 695 return m_response.mimeType(); |
| 696 } | 696 } |
| 697 | 697 |
| 698 // This is only called by FrameLoader::replaceDocumentWhileExecutingJavaScriptUR
L() | 698 // This is only called by FrameLoader::replaceDocumentWhileExecutingJavaScriptUR
L() |
| 699 void DocumentLoader::replaceDocumentWhileExecutingJavaScriptURL(const DocumentIn
it& init, const String& source) | 699 void DocumentLoader::replaceDocumentWhileExecutingJavaScriptURL(const DocumentIn
it& init, const String& source) |
| 700 { | 700 { |
| 701 m_writer = createWriterFor(init, mimeType(), m_writer ? m_writer->encoding()
: emptyAtom, true, ForceSynchronousParsing); | 701 m_writer = createWriterFor(init, mimeType(), m_writer ? m_writer->encoding()
: emptyAtom, true, ForceSynchronousParsing); |
| 702 if (!source.isNull()) | 702 if (!source.isNull()) |
| 703 m_writer->appendReplacingData(source); | 703 m_writer->appendReplacingData(source); |
| 704 endWriting(m_writer.get()); | 704 endWriting(m_writer.get()); |
| 705 } | 705 } |
| 706 | 706 |
| 707 DEFINE_WEAK_IDENTIFIER_MAP(DocumentLoader); | 707 DEFINE_WEAK_IDENTIFIER_MAP(DocumentLoader); |
| 708 | 708 |
| 709 } // namespace blink | 709 } // namespace blink |
| OLD | NEW |