Chromium Code Reviews| Index: third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp |
| diff --git a/third_party/WebKit/Source/core/dom/PendingScript.cpp b/third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp |
| similarity index 53% |
| copy from third_party/WebKit/Source/core/dom/PendingScript.cpp |
| copy to third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp |
| index 602f40737a1429d8cabad88b6b4e0f6984517e3a..589159b27e7245fa70c5be64a17c526470c2eeea 100644 |
| --- a/third_party/WebKit/Source/core/dom/PendingScript.cpp |
| +++ b/third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp |
| @@ -1,141 +1,77 @@ |
| -/* |
| - * Copyright (C) 2010 Google, Inc. All Rights Reserved. |
| - * |
| - * Redistribution and use in source and binary forms, with or without |
| - * modification, are permitted provided that the following conditions |
| - * are met: |
| - * 1. Redistributions of source code must retain the above copyright |
| - * notice, this list of conditions and the following disclaimer. |
| - * 2. Redistributions in binary form must reproduce the above copyright |
| - * notice, this list of conditions and the following disclaimer in the |
| - * documentation and/or other materials provided with the distribution. |
| - * |
| - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
| - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
| - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| - */ |
| - |
| -#include "core/dom/PendingScript.h" |
| +// Copyright 2017 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "core/dom/ClassicPendingScript.h" |
| #include "bindings/core/v8/ScriptSourceCode.h" |
| #include "bindings/core/v8/ScriptState.h" |
| +#include "bindings/core/v8/ScriptStreamer.h" |
| #include "bindings/core/v8/V8BindingForCore.h" |
| -#include "core/dom/ClassicScript.h" |
| #include "core/dom/Document.h" |
| -#include "core/dom/ScriptElementBase.h" |
| #include "core/dom/TaskRunnerHelper.h" |
| #include "core/frame/LocalFrame.h" |
| #include "core/frame/SubresourceIntegrity.h" |
| -#include "platform/SharedBuffer.h" |
| -#include "platform/wtf/CurrentTime.h" |
| +#include "platform/loader/fetch/MemoryCache.h" |
| namespace blink { |
| -PendingScript* PendingScript::Create(ScriptElementBase* element, |
| - ScriptResource* resource) { |
| - return new PendingScript(element, resource, TextPosition()); |
| +ClassicPendingScript* ClassicPendingScript::Create(ScriptElementBase* element, |
| + ScriptResource* resource) { |
| + return new ClassicPendingScript(element, resource, TextPosition()); |
| } |
| -PendingScript* PendingScript::Create(ScriptElementBase* element, |
| - const TextPosition& starting_position) { |
| - return new PendingScript(element, nullptr, starting_position); |
| +ClassicPendingScript* ClassicPendingScript::Create( |
| + ScriptElementBase* element, |
| + const TextPosition& starting_position) { |
| + return new ClassicPendingScript(element, nullptr, starting_position); |
| } |
| -PendingScript* PendingScript::CreateForTesting(ScriptResource* resource) { |
| - return new PendingScript(nullptr, resource, TextPosition(), true); |
| +ClassicPendingScript* ClassicPendingScript::CreateForTesting( |
| + ScriptResource* resource) { |
| + return new ClassicPendingScript(nullptr, resource, TextPosition(), true); |
| } |
| -PendingScript::PendingScript(ScriptElementBase* element, |
| - ScriptResource* resource, |
| - const TextPosition& starting_position, |
| - bool is_for_testing) |
| - : watching_for_load_(false), |
| - element_(element), |
| - starting_position_(starting_position), |
| +ClassicPendingScript::ClassicPendingScript( |
| + ScriptElementBase* element, |
| + ScriptResource* resource, |
| + const TextPosition& starting_position, |
| + bool is_for_testing) |
| + : PendingScript(element, starting_position), |
| integrity_failure_(false), |
| - parser_blocking_load_start_time_(0), |
| - client_(nullptr), |
| is_for_testing_(is_for_testing) { |
| CheckState(); |
| SetResource(resource); |
| MemoryCoordinator::Instance().RegisterClient(this); |
| } |
| -PendingScript::~PendingScript() {} |
| +ClassicPendingScript::~ClassicPendingScript() {} |
| -NOINLINE void PendingScript::CheckState() const { |
| +NOINLINE void ClassicPendingScript::CheckState() const { |
| // TODO(hiroshige): Turn these CHECK()s into DCHECK() before going to beta. |
| - CHECK(is_for_testing_ || element_); |
| + CHECK(is_for_testing_ || GetElement()); |
| CHECK(GetResource() || !streamer_); |
| CHECK(!streamer_ || streamer_->GetResource() == GetResource()); |
| } |
| -void PendingScript::Dispose() { |
| - StopWatchingForLoad(); |
| - DCHECK(!client_); |
| - DCHECK(!watching_for_load_); |
| +NOINLINE void ClassicPendingScript::Dispose() { |
| + PendingScript::Dispose(); |
| +} |
| +void ClassicPendingScript::DisposeInternal() { |
|
haraken
2017/04/25 17:19:51
Why can't you call DisposeInternal() before Classi
|
| MemoryCoordinator::Instance().UnregisterClient(this); |
| SetResource(nullptr); |
| - starting_position_ = TextPosition::BelowRangePosition(); |
| integrity_failure_ = false; |
| - parser_blocking_load_start_time_ = 0; |
| if (streamer_) |
| streamer_->Cancel(); |
| streamer_ = nullptr; |
| - element_ = nullptr; |
| } |
| -void PendingScript::WatchForLoad(PendingScriptClient* client) { |
| - CheckState(); |
| - |
| - DCHECK(!watching_for_load_); |
| - // addClient() will call streamingFinished() if the load is complete. Callers |
| - // who do not expect to be re-entered from this call should not call |
| - // watchForLoad for a PendingScript which isReady. We also need to set |
| - // m_watchingForLoad early, since addClient() can result in calling |
| - // notifyFinished and further stopWatchingForLoad(). |
| - watching_for_load_ = true; |
| - client_ = client; |
| - if (IsReady()) |
| - client_->PendingScriptFinished(this); |
| -} |
| - |
| -void PendingScript::StopWatchingForLoad() { |
| - if (!watching_for_load_) |
| - return; |
| +void ClassicPendingScript::StreamingFinished() { |
| CheckState(); |
| DCHECK(GetResource()); |
| - client_ = nullptr; |
| - watching_for_load_ = false; |
| -} |
| - |
| -ScriptElementBase* PendingScript::GetElement() const { |
| - // As mentioned in the comment at |m_element| declaration, |
| - // |m_element| must point to the corresponding ScriptLoader's |
| - // client. |
| - CHECK(element_); |
| - return element_.Get(); |
| -} |
| - |
| -void PendingScript::StreamingFinished() { |
| - CheckState(); |
| - DCHECK(GetResource()); |
| - if (client_) |
| - client_->PendingScriptFinished(this); |
| -} |
| - |
| -void PendingScript::MarkParserBlockingLoadStartTime() { |
| - DCHECK_EQ(parser_blocking_load_start_time_, 0.0); |
| - parser_blocking_load_start_time_ = MonotonicallyIncreasingTime(); |
| + if (Client()) |
| + Client()->PendingScriptFinished(this); |
| } |
| // Returns true if SRI check passed. |
| @@ -183,7 +119,7 @@ static bool CheckScriptResourceIntegrity(Resource* resource, |
| return true; |
| } |
| -void PendingScript::NotifyFinished(Resource* resource) { |
| +void ClassicPendingScript::NotifyFinished(Resource* resource) { |
| // The following SRI checks need to be here because, unfortunately, fetches |
| // are not done purely according to the Fetch spec. In particular, |
| // different requests for the same resource do not have different |
| @@ -207,33 +143,32 @@ void PendingScript::NotifyFinished(Resource* resource) { |
| // |
| // See https://crbug.com/500701 for more information. |
| CheckState(); |
| - if (element_) { |
| - integrity_failure_ = !CheckScriptResourceIntegrity(resource, element_); |
| + if (!is_for_testing_ && GetElement()) { |
| + integrity_failure_ = !CheckScriptResourceIntegrity(resource, GetElement()); |
| } |
| // If script streaming is in use, the client will be notified in |
| // streamingFinished. |
| if (streamer_) |
| streamer_->NotifyFinished(resource); |
| - else if (client_) |
| - client_->PendingScriptFinished(this); |
| + else if (Client()) |
| + Client()->PendingScriptFinished(this); |
| } |
| -void PendingScript::NotifyAppendData(ScriptResource* resource) { |
| +void ClassicPendingScript::NotifyAppendData(ScriptResource* resource) { |
| if (streamer_) |
| streamer_->NotifyAppendData(resource); |
| } |
| -DEFINE_TRACE(PendingScript) { |
| - visitor->Trace(element_); |
| +DEFINE_TRACE(ClassicPendingScript) { |
| visitor->Trace(streamer_); |
| - visitor->Trace(client_); |
| ResourceOwner<ScriptResource>::Trace(visitor); |
| MemoryCoordinatorClient::Trace(visitor); |
| + PendingScript::Trace(visitor); |
| } |
| -ClassicScript* PendingScript::GetSource(const KURL& document_url, |
| - bool& error_occurred) const { |
| +ClassicScript* ClassicPendingScript::GetSource(const KURL& document_url, |
| + bool& error_occurred) const { |
| CheckState(); |
| error_occurred = this->ErrorOccurred(); |
| @@ -245,17 +180,17 @@ ClassicScript* PendingScript::GetSource(const KURL& document_url, |
| } |
| return ClassicScript::Create(ScriptSourceCode( |
| - element_->TextContent(), document_url, StartingPosition())); |
| + GetElement()->TextContent(), document_url, StartingPosition())); |
| } |
| -void PendingScript::SetStreamer(ScriptStreamer* streamer) { |
| +void ClassicPendingScript::SetStreamer(ScriptStreamer* streamer) { |
| DCHECK(!streamer_); |
| - DCHECK(!watching_for_load_); |
| + DCHECK(!IsWatchingForLoad()); |
| streamer_ = streamer; |
| CheckState(); |
| } |
| -bool PendingScript::IsReady() const { |
| +bool ClassicPendingScript::IsReady() const { |
| CheckState(); |
| if (GetResource()) { |
| return GetResource()->IsLoaded() && (!streamer_ || streamer_->IsFinished()); |
| @@ -264,7 +199,7 @@ bool PendingScript::IsReady() const { |
| return true; |
| } |
| -bool PendingScript::ErrorOccurred() const { |
| +bool ClassicPendingScript::ErrorOccurred() const { |
| CheckState(); |
| if (GetResource()) |
| return GetResource()->ErrorOccurred() || integrity_failure_; |
| @@ -272,7 +207,7 @@ bool PendingScript::ErrorOccurred() const { |
| return false; |
| } |
| -void PendingScript::OnPurgeMemory() { |
| +void ClassicPendingScript::OnPurgeMemory() { |
| CheckState(); |
| if (!streamer_) |
| return; |
| @@ -280,7 +215,7 @@ void PendingScript::OnPurgeMemory() { |
| streamer_ = nullptr; |
| } |
| -void PendingScript::StartStreamingIfPossible( |
| +void ClassicPendingScript::StartStreamingIfPossible( |
| Document* document, |
| ScriptStreamer::Type streamer_type) { |
| if (!document->GetFrame()) |
| @@ -295,4 +230,16 @@ void PendingScript::StartStreamingIfPossible( |
| TaskRunnerHelper::Get(TaskType::kNetworking, document)); |
| } |
| +bool ClassicPendingScript::WasCanceled() const { |
| + return GetResource()->WasCanceled(); |
| +} |
| + |
| +KURL ClassicPendingScript::Url() const { |
| + return GetResource()->Url(); |
| +} |
| + |
| +void ClassicPendingScript::RemoveFromMemoryCache() { |
| + GetMemoryCache()->Remove(GetResource()); |
| +} |
| + |
| } // namespace blink |