Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Side by Side Diff: third_party/WebKit/Source/core/loader/DocumentLoader.cpp

Issue 2383403002: Reflow comments in core/loader (Closed)
Patch Set: yhirano comments Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 78
79 namespace blink { 79 namespace blink {
80 80
81 static bool isArchiveMIMEType(const String& mimeType) { 81 static bool isArchiveMIMEType(const String& mimeType) {
82 return equalIgnoringCase("multipart/related", mimeType); 82 return equalIgnoringCase("multipart/related", mimeType);
83 } 83 }
84 84
85 static bool shouldInheritSecurityOriginFromOwner(const KURL& url) { 85 static bool shouldInheritSecurityOriginFromOwner(const KURL& url) {
86 // https://html.spec.whatwg.org/multipage/browsers.html#origin 86 // https://html.spec.whatwg.org/multipage/browsers.html#origin
87 // 87 //
88 // If a Document is the initial "about:blank" document 88 // If a Document is the initial "about:blank" document The origin and
89 // The origin and effective script origin of the Document are those it 89 // effective script origin of the Document are those it was assigned when its
90 // was assigned when its browsing context was created. 90 // browsing context was created.
91 // 91 //
92 // Note: We generalize this to all "blank" URLs and invalid URLs because we 92 // Note: We generalize this to all "blank" URLs and invalid URLs because we
93 // treat all of these URLs as about:blank. 93 // treat all of these URLs as about:blank.
94 return url.isEmpty() || url.protocolIsAbout(); 94 return url.isEmpty() || url.protocolIsAbout();
95 } 95 }
96 96
97 DocumentLoader::DocumentLoader(LocalFrame* frame, 97 DocumentLoader::DocumentLoader(LocalFrame* frame,
98 const ResourceRequest& req, 98 const ResourceRequest& req,
99 const SubstituteData& substituteData) 99 const SubstituteData& substituteData)
100 : m_frame(frame), 100 : m_frame(frame),
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 192
193 if (resource) 193 if (resource)
194 fetcher()->preloadStarted(resource); 194 fetcher()->preloadStarted(resource);
195 return resource; 195 return resource;
196 } 196 }
197 197
198 void DocumentLoader::didRedirect(const KURL& oldURL, const KURL& newURL) { 198 void DocumentLoader::didRedirect(const KURL& oldURL, const KURL& newURL) {
199 timing().addRedirect(oldURL, newURL); 199 timing().addRedirect(oldURL, newURL);
200 200
201 // If a redirection happens during a back/forward navigation, don't restore 201 // If a redirection happens during a back/forward navigation, don't restore
202 // any state from the old HistoryItem. 202 // any state from the old HistoryItem. There is a provisional history item for
203 // There is a provisional history item for back/forward navigation only. 203 // back/forward navigation only. In the other case, clearing it is a no-op.
204 // In the other case, clearing it is a no-op.
205 DCHECK(frameLoader()); 204 DCHECK(frameLoader());
206 frameLoader()->clearProvisionalHistoryItem(); 205 frameLoader()->clearProvisionalHistoryItem();
207 } 206 }
208 207
209 void DocumentLoader::dispatchLinkHeaderPreloads( 208 void DocumentLoader::dispatchLinkHeaderPreloads(
210 ViewportDescriptionWrapper* viewport, 209 ViewportDescriptionWrapper* viewport,
211 LinkLoader::MediaPreloadPolicy mediaPolicy) { 210 LinkLoader::MediaPreloadPolicy mediaPolicy) {
212 LinkLoader::loadLinksFromHeader( 211 LinkLoader::loadLinksFromHeader(
213 response().httpHeaderField(HTTPNames::Link), response().url(), 212 response().httpHeaderField(HTTPNames::Link), response().url(),
214 m_frame->document(), NetworkHintsInterfaceImpl(), 213 m_frame->document(), NetworkHintsInterfaceImpl(),
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 responseEndTime = m_timeOfLastDataReceived; 281 responseEndTime = m_timeOfLastDataReceived;
283 if (!responseEndTime) 282 if (!responseEndTime)
284 responseEndTime = monotonicallyIncreasingTime(); 283 responseEndTime = monotonicallyIncreasingTime();
285 timing().setResponseEnd(responseEndTime); 284 timing().setResponseEnd(responseEndTime);
286 285
287 commitIfReady(); 286 commitIfReady();
288 if (!frameLoader()) 287 if (!frameLoader())
289 return; 288 return;
290 289
291 if (!maybeCreateArchive()) { 290 if (!maybeCreateArchive()) {
292 // If this is an empty document, it will not have actually been created yet. Commit dummy data so that 291 // If this is an empty document, it will not have actually been created yet.
293 // DocumentWriter::begin() gets called and creates the Document. 292 // Commit dummy data so that DocumentWriter::begin() gets called and creates
293 // the Document.
294 if (!m_writer) 294 if (!m_writer)
295 commitData(0, 0); 295 commitData(0, 0);
296 } 296 }
297 297
298 if (!m_frame) 298 if (!m_frame)
299 return; 299 return;
300 300
301 m_applicationCacheHost->finishedLoadingMainResource(); 301 m_applicationCacheHost->finishedLoadingMainResource();
302 endWriting(m_writer.get()); 302 endWriting(m_writer.get());
303 if (m_state < MainResourceDone) 303 if (m_state < MainResourceDone)
304 m_state = MainResourceDone; 304 m_state = MainResourceDone;
305 clearMainResourceHandle(); 305 clearMainResourceHandle();
306 } 306 }
307 307
308 void DocumentLoader::redirectReceived( 308 void DocumentLoader::redirectReceived(
309 Resource* resource, 309 Resource* resource,
310 ResourceRequest& request, 310 ResourceRequest& request,
311 const ResourceResponse& redirectResponse) { 311 const ResourceResponse& redirectResponse) {
312 DCHECK_EQ(resource, m_mainResource); 312 DCHECK_EQ(resource, m_mainResource);
313 DCHECK(!redirectResponse.isNull()); 313 DCHECK(!redirectResponse.isNull());
314 m_request = request; 314 m_request = request;
315 315
316 // If the redirecting url is not allowed to display content from the target or igin, 316 // If the redirecting url is not allowed to display content from the target
317 // then block the redirect. 317 // origin, then block the redirect.
318 const KURL& requestURL = m_request.url(); 318 const KURL& requestURL = m_request.url();
319 RefPtr<SecurityOrigin> redirectingOrigin = 319 RefPtr<SecurityOrigin> redirectingOrigin =
320 SecurityOrigin::create(redirectResponse.url()); 320 SecurityOrigin::create(redirectResponse.url());
321 if (!redirectingOrigin->canDisplay(requestURL)) { 321 if (!redirectingOrigin->canDisplay(requestURL)) {
322 FrameLoader::reportLocalLoadFailed(m_frame, requestURL.getString()); 322 FrameLoader::reportLocalLoadFailed(m_frame, requestURL.getString());
323 m_fetcher->stopFetching(); 323 m_fetcher->stopFetching();
324 return; 324 return;
325 } 325 }
326 if (!frameLoader()->shouldContinueForNavigationPolicy( 326 if (!frameLoader()->shouldContinueForNavigationPolicy(
327 m_request, SubstituteData(), this, CheckContentSecurityPolicy, 327 m_request, SubstituteData(), this, CheckContentSecurityPolicy,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 return true; 369 return true;
370 } 370 }
371 371
372 void DocumentLoader::cancelLoadAfterXFrameOptionsOrCSPDenied( 372 void DocumentLoader::cancelLoadAfterXFrameOptionsOrCSPDenied(
373 const ResourceResponse& response) { 373 const ResourceResponse& response) {
374 InspectorInstrumentation::continueAfterXFrameOptionsDenied( 374 InspectorInstrumentation::continueAfterXFrameOptionsDenied(
375 m_frame, this, mainResourceIdentifier(), response, m_mainResource.get()); 375 m_frame, this, mainResourceIdentifier(), response, m_mainResource.get());
376 376
377 setWasBlockedAfterXFrameOptionsOrCSP(); 377 setWasBlockedAfterXFrameOptionsOrCSP();
378 378
379 // Pretend that this was an empty HTTP 200 response. Don't reuse the 379 // Pretend that this was an empty HTTP 200 response. Don't reuse the original
380 // original URL for the empty page (https://crbug.com/622385). 380 // URL for the empty page (https://crbug.com/622385).
381 // 381 //
382 // TODO(mkwst): Remove this once XFO moves to the browser. 382 // TODO(mkwst): Remove this once XFO moves to the browser.
383 // https://crbug.com/555418. 383 // https://crbug.com/555418.
384 clearMainResourceHandle(); 384 clearMainResourceHandle();
385 KURL blockedURL = SecurityOrigin::urlWithUniqueSecurityOrigin(); 385 KURL blockedURL = SecurityOrigin::urlWithUniqueSecurityOrigin();
386 m_originalRequest.setURL(blockedURL); 386 m_originalRequest.setURL(blockedURL);
387 m_request.setURL(blockedURL); 387 m_request.setURL(blockedURL);
388 m_redirectChain.removeLast(); 388 m_redirectChain.removeLast();
389 appendRedirect(blockedURL); 389 appendRedirect(blockedURL);
390 m_response = ResourceResponse(blockedURL, "text/html", 0, nullAtom, String()); 390 m_response = ResourceResponse(blockedURL, "text/html", 0, nullAtom, String());
391 finishedLoading(monotonicallyIncreasingTime()); 391 finishedLoading(monotonicallyIncreasingTime());
392 392
393 return; 393 return;
394 } 394 }
395 395
396 void DocumentLoader::responseReceived( 396 void DocumentLoader::responseReceived(
397 Resource* resource, 397 Resource* resource,
398 const ResourceResponse& response, 398 const ResourceResponse& response,
399 std::unique_ptr<WebDataConsumerHandle> handle) { 399 std::unique_ptr<WebDataConsumerHandle> handle) {
400 DCHECK_EQ(m_mainResource, resource); 400 DCHECK_EQ(m_mainResource, resource);
401 DCHECK(!handle); 401 DCHECK(!handle);
402 DCHECK(frame()); 402 DCHECK(frame());
403 403
404 m_applicationCacheHost->didReceiveResponseForMainResource(response); 404 m_applicationCacheHost->didReceiveResponseForMainResource(response);
405 405
406 // The memory cache doesn't understand the application cache or its caching ru les. So if a main resource is served 406 // The memory cache doesn't understand the application cache or its caching
407 // from the application cache, ensure we don't save the result for future use. All responses loaded 407 // rules. So if a main resource is served from the application cache, ensure
408 // from appcache will have a non-zero appCacheID(). 408 // we don't save the result for future use. All responses loaded from appcache
409 // will have a non-zero appCacheID().
409 if (response.appCacheID()) 410 if (response.appCacheID())
410 memoryCache()->remove(m_mainResource.get()); 411 memoryCache()->remove(m_mainResource.get());
411 412
412 m_contentSecurityPolicy = ContentSecurityPolicy::create(); 413 m_contentSecurityPolicy = ContentSecurityPolicy::create();
413 m_contentSecurityPolicy->setOverrideURLForSelf(response.url()); 414 m_contentSecurityPolicy->setOverrideURLForSelf(response.url());
414 m_contentSecurityPolicy->didReceiveHeaders( 415 m_contentSecurityPolicy->didReceiveHeaders(
415 ContentSecurityPolicyResponseHeaders(response)); 416 ContentSecurityPolicyResponseHeaders(response));
416 if (!m_contentSecurityPolicy->allowAncestors(m_frame, response.url())) { 417 if (!m_contentSecurityPolicy->allowAncestors(m_frame, response.url())) {
417 cancelLoadAfterXFrameOptionsOrCSPDenied(response); 418 cancelLoadAfterXFrameOptionsOrCSPDenied(response);
418 return; 419 return;
419 } 420 }
420 421
421 // 'frame-ancestors' obviates 'x-frame-options': https://w3c.github.io/webapps ec/specs/content-security-policy/#frame-ancestors-and-frame-options 422 // 'frame-ancestors' obviates 'x-frame-options':
423 // https://w3c.github.io/webappsec/specs/content-security-policy/#frame-ancest ors-and-frame-options
422 if (!m_contentSecurityPolicy->isFrameAncestorsEnforced()) { 424 if (!m_contentSecurityPolicy->isFrameAncestorsEnforced()) {
423 HTTPHeaderMap::const_iterator it = 425 HTTPHeaderMap::const_iterator it =
424 response.httpHeaderFields().find(HTTPNames::X_Frame_Options); 426 response.httpHeaderFields().find(HTTPNames::X_Frame_Options);
425 if (it != response.httpHeaderFields().end()) { 427 if (it != response.httpHeaderFields().end()) {
426 String content = it->value; 428 String content = it->value;
427 if (frameLoader()->shouldInterruptLoadForXFrameOptions( 429 if (frameLoader()->shouldInterruptLoadForXFrameOptions(
428 content, response.url(), mainResourceIdentifier())) { 430 content, response.url(), mainResourceIdentifier())) {
429 String message = "Refused to display '" + 431 String message = "Refused to display '" +
430 response.url().elidedString() + 432 response.url().elidedString() +
431 "' in a frame because it set 'X-Frame-Options' to '" + 433 "' in a frame because it set 'X-Frame-Options' to '" +
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
519 void DocumentLoader::dataReceived(Resource* resource, 521 void DocumentLoader::dataReceived(Resource* resource,
520 const char* data, 522 const char* data,
521 size_t length) { 523 size_t length) {
522 DCHECK(data); 524 DCHECK(data);
523 DCHECK(length); 525 DCHECK(length);
524 DCHECK_EQ(resource, m_mainResource); 526 DCHECK_EQ(resource, m_mainResource);
525 DCHECK(!m_response.isNull()); 527 DCHECK(!m_response.isNull());
526 DCHECK(!m_frame->page()->defersLoading()); 528 DCHECK(!m_frame->page()->defersLoading());
527 529
528 if (m_inDataReceived) { 530 if (m_inDataReceived) {
529 // If this function is reentered, defer processing of the additional 531 // If this function is reentered, defer processing of the additional data to
530 // data to the top-level invocation. Reentrant calls can occur because 532 // the top-level invocation. Reentrant calls can occur because of web
531 // of web platform (mis-)features that require running a nested message 533 // platform (mis-)features that require running a nested message loop:
532 // loop:
533 // - alert(), confirm(), prompt() 534 // - alert(), confirm(), prompt()
534 // - Detach of plugin elements. 535 // - Detach of plugin elements.
535 // - Synchronous XMLHTTPRequest 536 // - Synchronous XMLHTTPRequest
536 m_dataBuffer->append(data, length); 537 m_dataBuffer->append(data, length);
537 return; 538 return;
538 } 539 }
539 540
540 AutoReset<bool> reentrancyProtector(&m_inDataReceived, true); 541 AutoReset<bool> reentrancyProtector(&m_inDataReceived, true);
541 processData(data, length); 542 processData(data, length);
542 543
543 // Process data received in reentrant invocations. Note that the 544 // Process data received in reentrant invocations. Note that the invocations
544 // invocations of processData() may queue more data in reentrant 545 // of processData() may queue more data in reentrant invocations, so iterate
545 // invocations, so iterate until it's empty. 546 // until it's empty.
546 const char* segment; 547 const char* segment;
547 size_t pos = 0; 548 size_t pos = 0;
548 while (size_t length = m_dataBuffer->getSomeData(segment, pos)) { 549 while (size_t length = m_dataBuffer->getSomeData(segment, pos)) {
549 processData(segment, length); 550 processData(segment, length);
550 pos += length; 551 pos += length;
551 } 552 }
552 // All data has been consumed, so flush the buffer. 553 // All data has been consumed, so flush the buffer.
553 m_dataBuffer->clear(); 554 m_dataBuffer->clear();
554 } 555 }
555 556
556 void DocumentLoader::processData(const char* data, size_t length) { 557 void DocumentLoader::processData(const char* data, size_t length) {
557 m_applicationCacheHost->mainResourceDataReceived(data, length); 558 m_applicationCacheHost->mainResourceDataReceived(data, length);
558 m_timeOfLastDataReceived = monotonicallyIncreasingTime(); 559 m_timeOfLastDataReceived = monotonicallyIncreasingTime();
559 560
560 if (isArchiveMIMEType(response().mimeType())) 561 if (isArchiveMIMEType(response().mimeType()))
561 return; 562 return;
562 commitIfReady(); 563 commitIfReady();
563 if (!frameLoader()) 564 if (!frameLoader())
564 return; 565 return;
565 commitData(data, length); 566 commitData(data, length);
566 567
567 // If we are sending data to MediaDocument, we should stop here 568 // If we are sending data to MediaDocument, we should stop here and cancel the
568 // and cancel the request. 569 // request.
569 if (m_frame && m_frame->document()->isMediaDocument()) 570 if (m_frame && m_frame->document()->isMediaDocument())
570 m_fetcher->stopFetching(); 571 m_fetcher->stopFetching();
571 } 572 }
572 573
573 void DocumentLoader::clearRedirectChain() { 574 void DocumentLoader::clearRedirectChain() {
574 m_redirectChain.clear(); 575 m_redirectChain.clear();
575 } 576 }
576 577
577 void DocumentLoader::appendRedirect(const KURL& url) { 578 void DocumentLoader::appendRedirect(const KURL& url) {
578 m_redirectChain.append(url); 579 m_redirectChain.append(url);
(...skipping 20 matching lines...) Expand all
599 } 600 }
600 601
601 void DocumentLoader::clearMainResourceHandle() { 602 void DocumentLoader::clearMainResourceHandle() {
602 if (!m_mainResource) 603 if (!m_mainResource)
603 return; 604 return;
604 m_mainResource->removeClient(this); 605 m_mainResource->removeClient(this);
605 m_mainResource = nullptr; 606 m_mainResource = nullptr;
606 } 607 }
607 608
608 bool DocumentLoader::maybeCreateArchive() { 609 bool DocumentLoader::maybeCreateArchive() {
609 // Give the archive machinery a crack at this document. If the MIME type is no t an archive type, it will return 0. 610 // Give the archive machinery a crack at this document. If the MIME type is
611 // not an archive type, it will return 0.
610 if (!isArchiveMIMEType(m_response.mimeType())) 612 if (!isArchiveMIMEType(m_response.mimeType()))
611 return false; 613 return false;
612 614
613 DCHECK(m_mainResource); 615 DCHECK(m_mainResource);
614 ArchiveResource* mainResource = 616 ArchiveResource* mainResource =
615 m_fetcher->createArchive(m_mainResource.get()); 617 m_fetcher->createArchive(m_mainResource.get());
616 if (!mainResource) 618 if (!mainResource)
617 return false; 619 return false;
618 // The origin is the MHTML file, we need to set the base URL to the document e ncoded in the MHTML so 620 // The origin is the MHTML file, we need to set the base URL to the document
619 // relative URLs are resolved properly. 621 // encoded in the MHTML so relative URLs are resolved properly.
620 ensureWriter(mainResource->mimeType(), mainResource->url()); 622 ensureWriter(mainResource->mimeType(), mainResource->url());
621 623
622 // The Document has now been created. 624 // The Document has now been created.
623 m_frame->document()->enforceSandboxFlags(SandboxAll); 625 m_frame->document()->enforceSandboxFlags(SandboxAll);
624 626
625 commitData(mainResource->data()->data(), mainResource->data()->size()); 627 commitData(mainResource->data()->data(), mainResource->data()->size());
626 return true; 628 return true;
627 } 629 }
628 630
629 const AtomicString& DocumentLoader::responseMIMEType() const { 631 const AtomicString& DocumentLoader::responseMIMEType() const {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 CheckContentSecurityPolicy, DocumentContext)); 677 CheckContentSecurityPolicy, DocumentContext));
676 FetchRequest fetchRequest(m_request, FetchInitiatorTypeNames::document, 678 FetchRequest fetchRequest(m_request, FetchInitiatorTypeNames::document,
677 mainResourceLoadOptions); 679 mainResourceLoadOptions);
678 m_mainResource = 680 m_mainResource =
679 RawResource::fetchMainResource(fetchRequest, fetcher(), m_substituteData); 681 RawResource::fetchMainResource(fetchRequest, fetcher(), m_substituteData);
680 if (!m_mainResource) { 682 if (!m_mainResource) {
681 m_request = ResourceRequest(blankURL()); 683 m_request = ResourceRequest(blankURL());
682 maybeLoadEmpty(); 684 maybeLoadEmpty();
683 return; 685 return;
684 } 686 }
685 // A bunch of headers are set when the underlying resource load begins, and m_ request needs to include those. 687 // A bunch of headers are set when the underlying resource load begins, and
686 // Even when using a cached resource, we may make some modification to the req uest, e.g. adding the referer header. 688 // m_request needs to include those. Even when using a cached resource, we may
689 // make some modification to the request, e.g. adding the referer header.
687 m_request = m_mainResource->isLoading() ? m_mainResource->resourceRequest() 690 m_request = m_mainResource->isLoading() ? m_mainResource->resourceRequest()
688 : fetchRequest.resourceRequest(); 691 : fetchRequest.resourceRequest();
689 m_mainResource->addClient(this); 692 m_mainResource->addClient(this);
690 } 693 }
691 694
692 void DocumentLoader::endWriting(DocumentWriter* writer) { 695 void DocumentLoader::endWriting(DocumentWriter* writer) {
693 DCHECK_EQ(m_writer, writer); 696 DCHECK_EQ(m_writer, writer);
694 m_writer->end(); 697 m_writer->end();
695 m_writer.clear(); 698 m_writer.clear();
696 } 699 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 731
729 return DocumentWriter::create(document, parsingPolicy, mimeType, encoding); 732 return DocumentWriter::create(document, parsingPolicy, mimeType, encoding);
730 } 733 }
731 734
732 const AtomicString& DocumentLoader::mimeType() const { 735 const AtomicString& DocumentLoader::mimeType() const {
733 if (m_writer) 736 if (m_writer)
734 return m_writer->mimeType(); 737 return m_writer->mimeType();
735 return m_response.mimeType(); 738 return m_response.mimeType();
736 } 739 }
737 740
738 // This is only called by FrameLoader::replaceDocumentWhileExecutingJavaScriptUR L() 741 // This is only called by
742 // FrameLoader::replaceDocumentWhileExecutingJavaScriptURL()
739 void DocumentLoader::replaceDocumentWhileExecutingJavaScriptURL( 743 void DocumentLoader::replaceDocumentWhileExecutingJavaScriptURL(
740 const DocumentInit& init, 744 const DocumentInit& init,
741 const String& source) { 745 const String& source) {
742 m_writer = createWriterFor(init, mimeType(), 746 m_writer = createWriterFor(init, mimeType(),
743 m_writer ? m_writer->encoding() : emptyAtom, true, 747 m_writer ? m_writer->encoding() : emptyAtom, true,
744 ForceSynchronousParsing); 748 ForceSynchronousParsing);
745 if (!source.isNull()) 749 if (!source.isNull())
746 m_writer->appendReplacingData(source); 750 m_writer->appendReplacingData(source);
747 endWriting(m_writer.get()); 751 endWriting(m_writer.get());
748 } 752 }
749 753
750 DEFINE_WEAK_IDENTIFIER_MAP(DocumentLoader); 754 DEFINE_WEAK_IDENTIFIER_MAP(DocumentLoader);
751 755
752 } // namespace blink 756 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698