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