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

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

Issue 1667843003: Make Resource RefCountedWillBeGarbageCollectedFinalized, attempt #2 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase + address review comments Created 4 years, 10 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 "bindings/core/v8/ScriptStreamerThread.h" 7 #include "bindings/core/v8/ScriptStreamerThread.h"
8 #include "bindings/core/v8/V8ScriptRunner.h" 8 #include "bindings/core/v8/V8ScriptRunner.h"
9 #include "core/dom/Document.h" 9 #include "core/dom/Document.h"
10 #include "core/dom/Element.h" 10 #include "core/dom/Element.h"
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 m_stream->didFinishLoading(); 570 m_stream->didFinishLoading();
571 m_loadingFinished = true; 571 m_loadingFinished = true;
572 572
573 // Calling notifyFinishedToClient can result into the upper layers dropping 573 // Calling notifyFinishedToClient can result into the upper layers dropping
574 // references to ScriptStreamer. Keep it alive until this function ends. 574 // references to ScriptStreamer. Keep it alive until this function ends.
575 RefPtrWillBeRawPtr<ScriptStreamer> protect(this); 575 RefPtrWillBeRawPtr<ScriptStreamer> protect(this);
576 576
577 notifyFinishedToClient(); 577 notifyFinishedToClient();
578 } 578 }
579 579
580 ScriptStreamer::ScriptStreamer(ScriptResource* resource, Type scriptType, Script State* scriptState, v8::ScriptCompiler::CompileOptions compileOptions, WebTaskRu nner* loadingTaskRunner) 580 ScriptStreamer::ScriptStreamer(PendingScript* script, Type scriptType, ScriptSta te* scriptState, v8::ScriptCompiler::CompileOptions compileOptions, WebTaskRunne r* loadingTaskRunner)
581 : m_resource(resource) 581 : m_pendingScript(script)
582 , m_resource(script->resource())
582 , m_detached(false) 583 , m_detached(false)
583 , m_stream(0) 584 , m_stream(0)
584 , m_client(0)
585 , m_loadingFinished(false) 585 , m_loadingFinished(false)
586 , m_parsingFinished(false) 586 , m_parsingFinished(false)
587 , m_haveEnoughDataForStreaming(false) 587 , m_haveEnoughDataForStreaming(false)
588 , m_streamingSuppressed(false) 588 , m_streamingSuppressed(false)
589 , m_compileOptions(compileOptions) 589 , m_compileOptions(compileOptions)
590 , m_scriptState(scriptState) 590 , m_scriptState(scriptState)
591 , m_scriptType(scriptType) 591 , m_scriptType(scriptType)
592 , m_encoding(v8::ScriptCompiler::StreamedSource::TWO_BYTE) // Unfortunately there's no dummy encoding value in the enum; let's use one we don't stream. 592 , m_encoding(v8::ScriptCompiler::StreamedSource::TWO_BYTE) // Unfortunately there's no dummy encoding value in the enum; let's use one we don't stream.
593 , m_loadingTaskRunner(adoptPtr(loadingTaskRunner->clone())) 593 , m_loadingTaskRunner(adoptPtr(loadingTaskRunner->clone()))
594 { 594 {
595 } 595 }
596 596
597 ScriptStreamer::~ScriptStreamer() 597 ScriptStreamer::~ScriptStreamer()
598 { 598 {
599 } 599 }
600 600
601 DEFINE_TRACE(ScriptStreamer) 601 DEFINE_TRACE(ScriptStreamer)
602 { 602 {
603 visitor->trace(m_pendingScript);
603 visitor->trace(m_resource); 604 visitor->trace(m_resource);
604 } 605 }
605 606
606 void ScriptStreamer::streamingComplete() 607 void ScriptStreamer::streamingComplete()
607 { 608 {
608 // The background task is completed; do the necessary ramp-down in the main 609 // The background task is completed; do the necessary ramp-down in the main
609 // thread. 610 // thread.
610 ASSERT(isMainThread()); 611 ASSERT(isMainThread());
611 612
612 // It's possible that the corresponding Resource was deleted before V8 613 // It's possible that the corresponding Resource was deleted before V8
(...skipping 22 matching lines...) Expand all
635 // time to catch up. But the other way is possible too: if V8 detects a 636 // time to catch up. But the other way is possible too: if V8 detects a
636 // parse error, the V8 side can complete before loading has finished. Send 637 // parse error, the V8 side can complete before loading has finished. Send
637 // the notification after both loading and V8 side operations have 638 // the notification after both loading and V8 side operations have
638 // completed. Here we also check that we have a client: it can happen that a 639 // completed. Here we also check that we have a client: it can happen that a
639 // function calling notifyFinishedToClient was already scheduled in the task 640 // function calling notifyFinishedToClient was already scheduled in the task
640 // queue and the upper layer decided that it's not interested in the script 641 // queue and the upper layer decided that it's not interested in the script
641 // and called removeClient. 642 // and called removeClient.
642 if (!isFinished()) 643 if (!isFinished())
643 return; 644 return;
644 645
645 if (m_client) 646 m_pendingScript->streamingFinished();
646 m_client->notifyFinished(m_resource);
647 } 647 }
648 648
649 bool ScriptStreamer::startStreamingInternal(PendingScript* script, Type scriptTy pe, Settings* settings, ScriptState* scriptState, WebTaskRunner* loadingTaskRunn er) 649 bool ScriptStreamer::startStreamingInternal(PendingScript* script, Type scriptTy pe, Settings* settings, ScriptState* scriptState, WebTaskRunner* loadingTaskRunn er)
650 { 650 {
651 ASSERT(isMainThread()); 651 ASSERT(isMainThread());
652 ASSERT(scriptState->contextIsValid()); 652 ASSERT(scriptState->contextIsValid());
653 ScriptResource* resource = script->resource(); 653 ScriptResource* resource = script->resource();
654 if (resource->isLoaded()) { 654 if (resource->isLoaded()) {
655 recordNotStreamingReasonHistogram(scriptType, AlreadyLoaded); 655 recordNotStreamingReasonHistogram(scriptType, AlreadyLoaded);
656 return false; 656 return false;
(...skipping 15 matching lines...) Expand all
672 672
673 // Decide what kind of cached data we should produce while streaming. Only 673 // Decide what kind of cached data we should produce while streaming. Only
674 // produce parser cache if the non-streaming compile takes advantage of it. 674 // produce parser cache if the non-streaming compile takes advantage of it.
675 v8::ScriptCompiler::CompileOptions compileOption = v8::ScriptCompiler::kNoCo mpileOptions; 675 v8::ScriptCompiler::CompileOptions compileOption = v8::ScriptCompiler::kNoCo mpileOptions;
676 if (settings->v8CacheOptions() == V8CacheOptionsParse) 676 if (settings->v8CacheOptions() == V8CacheOptionsParse)
677 compileOption = v8::ScriptCompiler::kProduceParserCache; 677 compileOption = v8::ScriptCompiler::kProduceParserCache;
678 678
679 // The Resource might go out of scope if the script is no longer 679 // The Resource might go out of scope if the script is no longer
680 // needed. This makes PendingScript notify the ScriptStreamer when it is 680 // needed. This makes PendingScript notify the ScriptStreamer when it is
681 // destroyed. 681 // destroyed.
682 script->setStreamer(ScriptStreamer::create(resource, scriptType, scriptState , compileOption, loadingTaskRunner)); 682 script->setStreamer(ScriptStreamer::create(script, scriptType, scriptState, compileOption, loadingTaskRunner));
683 683
684 return true; 684 return true;
685 } 685 }
686 686
687 } // namespace blink 687 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698