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

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: Rebase 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 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 // bookmarkPosition: position of the bookmark. 320 // bookmarkPosition: position of the bookmark.
321 SourceStreamDataQueue data_queue_; // Thread safe. 321 SourceStreamDataQueue data_queue_; // Thread safe.
322 size_t queue_lead_position_; // Only used by v8 thread. 322 size_t queue_lead_position_; // Only used by v8 thread.
323 size_t queue_tail_position_; // Used by both threads; guarded by m_mutex. 323 size_t queue_tail_position_; // Used by both threads; guarded by m_mutex.
324 324
325 RefPtr<WebTaskRunner> loading_task_runner_; 325 RefPtr<WebTaskRunner> loading_task_runner_;
326 }; 326 };
327 327
328 size_t ScriptStreamer::small_script_threshold_ = 30 * 1024; 328 size_t ScriptStreamer::small_script_threshold_ = 30 * 1024;
329 329
330 void ScriptStreamer::StartStreaming(PendingScript* script, 330 void ScriptStreamer::StartStreaming(ClassicPendingScript* script,
331 Type script_type, 331 Type script_type,
332 Settings* settings, 332 Settings* settings,
333 ScriptState* script_state, 333 ScriptState* script_state,
334 RefPtr<WebTaskRunner> loading_task_runner) { 334 RefPtr<WebTaskRunner> loading_task_runner) {
335 // We don't yet know whether the script will really be streamed. E.g., 335 // We don't yet know whether the script will really be streamed. E.g.,
336 // suppressing streaming for short scripts is done later. Record only the 336 // suppressing streaming for short scripts is done later. Record only the
337 // sure negative cases here. 337 // sure negative cases here.
338 bool started_streaming = 338 bool started_streaming =
339 StartStreamingInternal(script, script_type, settings, script_state, 339 StartStreamingInternal(script, script_type, settings, script_state,
340 std::move(loading_task_runner)); 340 std::move(loading_task_runner));
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 SuppressStreaming(); 510 SuppressStreaming();
511 } 511 }
512 if (stream_) 512 if (stream_)
513 stream_->DidFinishLoading(); 513 stream_->DidFinishLoading();
514 loading_finished_ = true; 514 loading_finished_ = true;
515 515
516 NotifyFinishedToClient(); 516 NotifyFinishedToClient();
517 } 517 }
518 518
519 ScriptStreamer::ScriptStreamer( 519 ScriptStreamer::ScriptStreamer(
520 PendingScript* script, 520 ClassicPendingScript* script,
521 Type script_type, 521 Type script_type,
522 ScriptState* script_state, 522 ScriptState* script_state,
523 v8::ScriptCompiler::CompileOptions compile_options, 523 v8::ScriptCompiler::CompileOptions compile_options,
524 RefPtr<WebTaskRunner> loading_task_runner) 524 RefPtr<WebTaskRunner> loading_task_runner)
525 : pending_script_(script), 525 : pending_script_(script),
526 resource_(script->GetResource()), 526 resource_(script->GetResource()),
527 detached_(false), 527 detached_(false),
528 stream_(0), 528 stream_(0),
529 loading_finished_(false), 529 loading_finished_(false),
530 parsing_finished_(false), 530 parsing_finished_(false),
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
574 // parse error, the V8 side can complete before loading has finished. Send 574 // parse error, the V8 side can complete before loading has finished. Send
575 // the notification after both loading and V8 side operations have 575 // the notification after both loading and V8 side operations have
576 // completed. 576 // completed.
577 if (!IsFinished()) 577 if (!IsFinished())
578 return; 578 return;
579 579
580 pending_script_->StreamingFinished(); 580 pending_script_->StreamingFinished();
581 } 581 }
582 582
583 bool ScriptStreamer::StartStreamingInternal( 583 bool ScriptStreamer::StartStreamingInternal(
584 PendingScript* script, 584 ClassicPendingScript* script,
585 Type script_type, 585 Type script_type,
586 Settings* settings, 586 Settings* settings,
587 ScriptState* script_state, 587 ScriptState* script_state,
588 RefPtr<WebTaskRunner> loading_task_runner) { 588 RefPtr<WebTaskRunner> loading_task_runner) {
589 DCHECK(IsMainThread()); 589 DCHECK(IsMainThread());
590 DCHECK(script_state->ContextIsValid()); 590 DCHECK(script_state->ContextIsValid());
591 ScriptResource* resource = script->GetResource(); 591 ScriptResource* resource = script->GetResource();
592 if (resource->IsLoaded()) { 592 if (resource->IsLoaded()) {
593 RecordNotStreamingReasonHistogram(script_type, kAlreadyLoaded); 593 RecordNotStreamingReasonHistogram(script_type, kAlreadyLoaded);
594 return false; 594 return false;
595 } 595 }
596 if (!resource->Url().ProtocolIsInHTTPFamily()) { 596 if (!resource->Url().ProtocolIsInHTTPFamily()) {
597 RecordNotStreamingReasonHistogram(script_type, kNotHTTP); 597 RecordNotStreamingReasonHistogram(script_type, kNotHTTP);
598 return false; 598 return false;
599 } 599 }
600 if (resource->IsCacheValidator()) { 600 if (resource->IsCacheValidator()) {
601 RecordNotStreamingReasonHistogram(script_type, kReload); 601 RecordNotStreamingReasonHistogram(script_type, kReload);
602 // This happens e.g., during reloads. We're actually not going to load 602 // This happens e.g., during reloads. We're actually not going to load
603 // the current Resource of the PendingScript but switch to another 603 // the current Resource of the ClassicPendingScript but switch to another
604 // Resource -> don't stream. 604 // Resource -> don't stream.
605 return false; 605 return false;
606 } 606 }
607 // We cannot filter out short scripts, even if we wait for the HTTP headers 607 // We cannot filter out short scripts, even if we wait for the HTTP headers
608 // to arrive: the Content-Length HTTP header is not sent for chunked 608 // to arrive: the Content-Length HTTP header is not sent for chunked
609 // downloads. 609 // downloads.
610 610
611 // Decide what kind of cached data we should produce while streaming. Only 611 // Decide what kind of cached data we should produce while streaming. Only
612 // produce parser cache if the non-streaming compile takes advantage of it. 612 // produce parser cache if the non-streaming compile takes advantage of it.
613 v8::ScriptCompiler::CompileOptions compile_option = 613 v8::ScriptCompiler::CompileOptions compile_option =
614 v8::ScriptCompiler::kNoCompileOptions; 614 v8::ScriptCompiler::kNoCompileOptions;
615 if (settings->GetV8CacheOptions() == kV8CacheOptionsParse) 615 if (settings->GetV8CacheOptions() == kV8CacheOptionsParse)
616 compile_option = v8::ScriptCompiler::kProduceParserCache; 616 compile_option = v8::ScriptCompiler::kProduceParserCache;
617 617
618 // The Resource might go out of scope if the script is no longer 618 // The Resource might go out of scope if the script is no longer needed.
619 // needed. This makes PendingScript notify the ScriptStreamer when it is 619 // This makes ClassicPendingScript notify the ScriptStreamer when it is
620 // destroyed. 620 // destroyed.
621 script->SetStreamer(ScriptStreamer::Create(script, script_type, script_state, 621 script->SetStreamer(ScriptStreamer::Create(script, script_type, script_state,
622 compile_option, 622 compile_option,
623 std::move(loading_task_runner))); 623 std::move(loading_task_runner)));
624 624
625 return true; 625 return true;
626 } 626 }
627 627
628 } // namespace blink 628 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698