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

Unified Diff: third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp

Issue 2820753002: Revert of Split PendingScript into PendingScript and ClassicPendingScript (Closed)
Patch Set: 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp
diff --git a/third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp b/third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp
deleted file mode 100644
index 2ff50687291613bb34d55af582d2715bc2ebe380..0000000000000000000000000000000000000000
--- a/third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp
+++ /dev/null
@@ -1,240 +0,0 @@
-// 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/V8Binding.h"
-#include "core/dom/Document.h"
-#include "core/dom/TaskRunnerHelper.h"
-#include "core/frame/LocalFrame.h"
-#include "core/frame/SubresourceIntegrity.h"
-#include "platform/loader/fetch/MemoryCache.h"
-
-namespace blink {
-
-ClassicPendingScript* ClassicPendingScript::Create(ScriptElementBase* element,
- ScriptResource* resource) {
- return new ClassicPendingScript(element, resource, TextPosition());
-}
-
-ClassicPendingScript* ClassicPendingScript::Create(
- ScriptElementBase* element,
- const TextPosition& starting_position) {
- return new ClassicPendingScript(element, nullptr, starting_position);
-}
-
-ClassicPendingScript* ClassicPendingScript::CreateForTesting(
- ScriptResource* resource) {
- return new ClassicPendingScript(nullptr, resource, TextPosition(), true);
-}
-
-ClassicPendingScript::ClassicPendingScript(
- ScriptElementBase* element,
- ScriptResource* resource,
- const TextPosition& starting_position,
- bool is_for_testing)
- : PendingScript(element, starting_position),
- integrity_failure_(false),
- is_for_testing_(is_for_testing) {
- CheckState();
- SetResource(resource);
- MemoryCoordinator::Instance().RegisterClient(this);
-}
-
-ClassicPendingScript::~ClassicPendingScript() {}
-
-NOINLINE void ClassicPendingScript::CheckState() const {
- // TODO(hiroshige): Turn these CHECK()s into DCHECK() before going to beta.
- CHECK(is_for_testing_ || GetElement());
- CHECK(GetResource() || !streamer_);
- CHECK(!streamer_ || streamer_->GetResource() == GetResource());
-}
-
-void ClassicPendingScript::DisposeInternal() {
- MemoryCoordinator::Instance().UnregisterClient(this);
- SetResource(nullptr);
- integrity_failure_ = false;
- if (streamer_)
- streamer_->Cancel();
- streamer_ = nullptr;
-}
-
-void ClassicPendingScript::StreamingFinished() {
- CheckState();
- DCHECK(GetResource());
- if (Client())
- Client()->PendingScriptFinished(this);
-}
-
-// Returns true if SRI check passed.
-static bool CheckScriptResourceIntegrity(Resource* resource,
- ScriptElementBase* element) {
- DCHECK_EQ(resource->GetType(), Resource::kScript);
- ScriptResource* script_resource = ToScriptResource(resource);
- String integrity_attr = element->IntegrityAttributeValue();
-
- // It is possible to get back a script resource with integrity metadata
- // for a request with an empty integrity attribute. In that case, the
- // integrity check should be skipped, so this check ensures that the
- // integrity attribute isn't empty in addition to checking if the
- // resource has empty integrity metadata.
- if (integrity_attr.IsEmpty() ||
- script_resource->IntegrityMetadata().IsEmpty())
- return true;
-
- switch (script_resource->IntegrityDisposition()) {
- case ResourceIntegrityDisposition::kPassed:
- return true;
-
- case ResourceIntegrityDisposition::kFailed:
- // TODO(jww): This should probably also generate a console
- // message identical to the one produced by
- // CheckSubresourceIntegrity below. See https://crbug.com/585267.
- return false;
-
- case ResourceIntegrityDisposition::kNotChecked: {
- if (!resource->ResourceBuffer())
- return true;
-
- bool passed = SubresourceIntegrity::CheckSubresourceIntegrity(
- script_resource->IntegrityMetadata(), element->GetDocument(),
- resource->ResourceBuffer()->Data(),
- resource->ResourceBuffer()->size(), resource->Url(), *resource);
- script_resource->SetIntegrityDisposition(
- passed ? ResourceIntegrityDisposition::kPassed
- : ResourceIntegrityDisposition::kFailed);
- return passed;
- }
- }
-
- NOTREACHED();
- return true;
-}
-
-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
- // responses; the memory cache can (and will) return the exact same
- // Resource object.
- //
- // For different requests, the same Resource object will be returned and
- // will not be associated with the particular request. Therefore, when the
- // body of the response comes in, there's no way to validate the integrity
- // of the Resource object against a particular request (since there may be
- // several pending requests all tied to the identical object, and the
- // actual requests are not stored).
- //
- // In order to simulate the correct behavior, Blink explicitly does the SRI
- // checks here, when a PendingScript tied to a particular request is
- // finished (and in the case of a StyleSheet, at the point of execution),
- // while having proper Fetch checks in the fetch module for use in the
- // fetch JavaScript API. In a future world where the ResourceFetcher uses
- // the Fetch algorithm, this should be fixed by having separate Response
- // objects (perhaps attached to identical Resource objects) per request.
- //
- // See https://crbug.com/500701 for more information.
- CheckState();
- 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);
-}
-
-void ClassicPendingScript::NotifyAppendData(ScriptResource* resource) {
- if (streamer_)
- streamer_->NotifyAppendData(resource);
-}
-
-DEFINE_TRACE(ClassicPendingScript) {
- visitor->Trace(streamer_);
- ResourceOwner<ScriptResource>::Trace(visitor);
- MemoryCoordinatorClient::Trace(visitor);
- PendingScript::Trace(visitor);
-}
-
-ClassicScript* ClassicPendingScript::GetSource(const KURL& document_url,
- bool& error_occurred) const {
- CheckState();
-
- error_occurred = this->ErrorOccurred();
- if (GetResource()) {
- DCHECK(GetResource()->IsLoaded());
- if (streamer_ && !streamer_->StreamingSuppressed())
- return ClassicScript::Create(ScriptSourceCode(streamer_, GetResource()));
- return ClassicScript::Create(ScriptSourceCode(GetResource()));
- }
-
- return ClassicScript::Create(ScriptSourceCode(
- GetElement()->TextContent(), document_url, StartingPosition()));
-}
-
-void ClassicPendingScript::SetStreamer(ScriptStreamer* streamer) {
- DCHECK(!streamer_);
- DCHECK(!IsWatchingForLoad());
- streamer_ = streamer;
- CheckState();
-}
-
-bool ClassicPendingScript::IsReady() const {
- CheckState();
- if (GetResource()) {
- return GetResource()->IsLoaded() && (!streamer_ || streamer_->IsFinished());
- }
-
- return true;
-}
-
-bool ClassicPendingScript::ErrorOccurred() const {
- CheckState();
- if (GetResource())
- return GetResource()->ErrorOccurred() || integrity_failure_;
-
- return false;
-}
-
-void ClassicPendingScript::OnPurgeMemory() {
- CheckState();
- if (!streamer_)
- return;
- streamer_->Cancel();
- streamer_ = nullptr;
-}
-
-void ClassicPendingScript::StartStreamingIfPossible(
- Document* document,
- ScriptStreamer::Type streamer_type) {
- if (!document->GetFrame())
- return;
-
- ScriptState* script_state = ToScriptStateForMainWorld(document->GetFrame());
- if (!script_state)
- return;
-
- ScriptStreamer::StartStreaming(
- this, streamer_type, document->GetFrame()->GetSettings(), script_state,
- 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
« no previous file with comments | « third_party/WebKit/Source/core/dom/ClassicPendingScript.h ('k') | third_party/WebKit/Source/core/dom/PendingScript.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698