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

Side by Side Diff: third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.cpp

Issue 2653923008: Reland of Split PendingScript into PendingScript and ClassicPendingScript (Closed)
Patch Set: Fix file header Created 3 years, 8 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 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "bindings/core/v8/ScriptStreamer.h" 5 #include "bindings/core/v8/ScriptStreamer.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include "bindings/core/v8/ScriptStreamerThread.h" 8 #include "bindings/core/v8/ScriptStreamerThread.h"
9 #include "bindings/core/v8/V8ScriptRunner.h" 9 #include "bindings/core/v8/V8ScriptRunner.h"
10 #include "core/dom/ClassicPendingScript.h"
10 #include "core/dom/Document.h" 11 #include "core/dom/Document.h"
11 #include "core/dom/Element.h" 12 #include "core/dom/Element.h"
12 #include "core/dom/PendingScript.h"
13 #include "core/frame/Settings.h" 13 #include "core/frame/Settings.h"
14 #include "core/html/parser/TextResourceDecoder.h" 14 #include "core/html/parser/TextResourceDecoder.h"
15 #include "core/loader/resource/ScriptResource.h" 15 #include "core/loader/resource/ScriptResource.h"
16 #include "platform/CrossThreadFunctional.h" 16 #include "platform/CrossThreadFunctional.h"
17 #include "platform/Histogram.h" 17 #include "platform/Histogram.h"
18 #include "platform/SharedBuffer.h" 18 #include "platform/SharedBuffer.h"
19 #include "platform/instrumentation/tracing/TraceEvent.h" 19 #include "platform/instrumentation/tracing/TraceEvent.h"
20 #include "platform/loader/fetch/CachedMetadata.h" 20 #include "platform/loader/fetch/CachedMetadata.h"
21 #include "platform/wtf/Deque.h" 21 #include "platform/wtf/Deque.h"
22 #include "platform/wtf/PtrUtil.h" 22 #include "platform/wtf/PtrUtil.h"
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 // bookmarkPosition: position of the bookmark. 315 // bookmarkPosition: position of the bookmark.
316 SourceStreamDataQueue m_dataQueue; // Thread safe. 316 SourceStreamDataQueue m_dataQueue; // Thread safe.
317 size_t m_queueLeadPosition; // Only used by v8 thread. 317 size_t m_queueLeadPosition; // Only used by v8 thread.
318 size_t m_queueTailPosition; // Used by both threads; guarded by m_mutex. 318 size_t m_queueTailPosition; // Used by both threads; guarded by m_mutex.
319 319
320 RefPtr<WebTaskRunner> m_loadingTaskRunner; 320 RefPtr<WebTaskRunner> m_loadingTaskRunner;
321 }; 321 };
322 322
323 size_t ScriptStreamer::s_smallScriptThreshold = 30 * 1024; 323 size_t ScriptStreamer::s_smallScriptThreshold = 30 * 1024;
324 324
325 void ScriptStreamer::startStreaming(PendingScript* script, 325 void ScriptStreamer::startStreaming(ClassicPendingScript* script,
326 Type scriptType, 326 Type scriptType,
327 Settings* settings, 327 Settings* settings,
328 ScriptState* scriptState, 328 ScriptState* scriptState,
329 RefPtr<WebTaskRunner> loadingTaskRunner) { 329 RefPtr<WebTaskRunner> loadingTaskRunner) {
330 // We don't yet know whether the script will really be streamed. E.g., 330 // We don't yet know whether the script will really be streamed. E.g.,
331 // suppressing streaming for short scripts is done later. Record only the 331 // suppressing streaming for short scripts is done later. Record only the
332 // sure negative cases here. 332 // sure negative cases here.
333 bool startedStreaming = startStreamingInternal( 333 bool startedStreaming = startStreamingInternal(
334 script, scriptType, settings, scriptState, std::move(loadingTaskRunner)); 334 script, scriptType, settings, scriptState, std::move(loadingTaskRunner));
335 if (!startedStreaming) 335 if (!startedStreaming)
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 suppressStreaming(); 504 suppressStreaming();
505 } 505 }
506 if (m_stream) 506 if (m_stream)
507 m_stream->didFinishLoading(); 507 m_stream->didFinishLoading();
508 m_loadingFinished = true; 508 m_loadingFinished = true;
509 509
510 notifyFinishedToClient(); 510 notifyFinishedToClient();
511 } 511 }
512 512
513 ScriptStreamer::ScriptStreamer( 513 ScriptStreamer::ScriptStreamer(
514 PendingScript* script, 514 ClassicPendingScript* script,
515 Type scriptType, 515 Type scriptType,
516 ScriptState* scriptState, 516 ScriptState* scriptState,
517 v8::ScriptCompiler::CompileOptions compileOptions, 517 v8::ScriptCompiler::CompileOptions compileOptions,
518 RefPtr<WebTaskRunner> loadingTaskRunner) 518 RefPtr<WebTaskRunner> loadingTaskRunner)
519 : m_pendingScript(script), 519 : m_pendingScript(script),
520 m_resource(script->resource()), 520 m_resource(script->resource()),
521 m_detached(false), 521 m_detached(false),
522 m_stream(0), 522 m_stream(0),
523 m_loadingFinished(false), 523 m_loadingFinished(false),
524 m_parsingFinished(false), 524 m_parsingFinished(false),
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 // parse error, the V8 side can complete before loading has finished. Send 568 // parse error, the V8 side can complete before loading has finished. Send
569 // the notification after both loading and V8 side operations have 569 // the notification after both loading and V8 side operations have
570 // completed. 570 // completed.
571 if (!isFinished()) 571 if (!isFinished())
572 return; 572 return;
573 573
574 m_pendingScript->streamingFinished(); 574 m_pendingScript->streamingFinished();
575 } 575 }
576 576
577 bool ScriptStreamer::startStreamingInternal( 577 bool ScriptStreamer::startStreamingInternal(
578 PendingScript* script, 578 ClassicPendingScript* script,
579 Type scriptType, 579 Type scriptType,
580 Settings* settings, 580 Settings* settings,
581 ScriptState* scriptState, 581 ScriptState* scriptState,
582 RefPtr<WebTaskRunner> loadingTaskRunner) { 582 RefPtr<WebTaskRunner> loadingTaskRunner) {
583 DCHECK(isMainThread()); 583 DCHECK(isMainThread());
584 DCHECK(scriptState->contextIsValid()); 584 DCHECK(scriptState->contextIsValid());
585 ScriptResource* resource = script->resource(); 585 ScriptResource* resource = script->resource();
586 if (resource->isLoaded()) { 586 if (resource->isLoaded()) {
587 recordNotStreamingReasonHistogram(scriptType, AlreadyLoaded); 587 recordNotStreamingReasonHistogram(scriptType, AlreadyLoaded);
588 return false; 588 return false;
589 } 589 }
590 if (!resource->url().protocolIsInHTTPFamily()) { 590 if (!resource->url().protocolIsInHTTPFamily()) {
591 recordNotStreamingReasonHistogram(scriptType, NotHTTP); 591 recordNotStreamingReasonHistogram(scriptType, NotHTTP);
592 return false; 592 return false;
593 } 593 }
594 if (resource->isCacheValidator()) { 594 if (resource->isCacheValidator()) {
595 recordNotStreamingReasonHistogram(scriptType, Reload); 595 recordNotStreamingReasonHistogram(scriptType, Reload);
596 // This happens e.g., during reloads. We're actually not going to load 596 // This happens e.g., during reloads. We're actually not going to load
597 // the current Resource of the PendingScript but switch to another 597 // the current Resource of the ClassicPendingScript but switch to another
598 // Resource -> don't stream. 598 // Resource -> don't stream.
599 return false; 599 return false;
600 } 600 }
601 // We cannot filter out short scripts, even if we wait for the HTTP headers 601 // We cannot filter out short scripts, even if we wait for the HTTP headers
602 // to arrive: the Content-Length HTTP header is not sent for chunked 602 // to arrive: the Content-Length HTTP header is not sent for chunked
603 // downloads. 603 // downloads.
604 604
605 // Decide what kind of cached data we should produce while streaming. Only 605 // Decide what kind of cached data we should produce while streaming. Only
606 // produce parser cache if the non-streaming compile takes advantage of it. 606 // produce parser cache if the non-streaming compile takes advantage of it.
607 v8::ScriptCompiler::CompileOptions compileOption = 607 v8::ScriptCompiler::CompileOptions compileOption =
608 v8::ScriptCompiler::kNoCompileOptions; 608 v8::ScriptCompiler::kNoCompileOptions;
609 if (settings->getV8CacheOptions() == V8CacheOptionsParse) 609 if (settings->getV8CacheOptions() == V8CacheOptionsParse)
610 compileOption = v8::ScriptCompiler::kProduceParserCache; 610 compileOption = v8::ScriptCompiler::kProduceParserCache;
611 611
612 // The Resource might go out of scope if the script is no longer 612 // The Resource might go out of scope if the script is no longer
613 // needed. This makes PendingScript notify the ScriptStreamer when it is 613 // needed. This makes ClassicPendingScript notify the ScriptStreamer when it
614 // destroyed. 614 // is destroyed.
615 script->setStreamer(ScriptStreamer::create(script, scriptType, scriptState, 615 script->setStreamer(ScriptStreamer::create(script, scriptType, scriptState,
616 compileOption, 616 compileOption,
617 std::move(loadingTaskRunner))); 617 std::move(loadingTaskRunner)));
618 618
619 return true; 619 return true;
620 } 620 }
621 621
622 } // namespace blink 622 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698