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

Unified Diff: third_party/WebKit/Source/bindings/core/v8/ScriptState.h

Issue 2843603002: Move ScriptWrappable and dependencies to platform/bindings (Closed)
Patch Set: Rebase and try again 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/bindings/core/v8/ScriptState.h
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptState.h b/third_party/WebKit/Source/bindings/core/v8/ScriptState.h
index ba02bfadb083055fa0ab4262d98c8dffee0ad1fd..c358d666e664b5be4e600c156f73c81ff154a4d4 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptState.h
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptState.h
@@ -2,200 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef ScriptState_h
-#define ScriptState_h
-
-#include <memory>
-
-#include "bindings/core/v8/ScopedPersistent.h"
-#include "bindings/core/v8/V8PerContextData.h"
-#include "core/CoreExport.h"
-#include "platform/wtf/RefCounted.h"
-#include "v8/include/v8-debug.h"
-#include "v8/include/v8.h"
-
-namespace blink {
-
-class DOMWrapperWorld;
-class ScriptValue;
-
-// ScriptState is an abstraction class that holds all information about script
-// exectuion (e.g., v8::Isolate, v8::Context, DOMWrapperWorld, ExecutionContext
-// etc). If you need any info about the script execution, you're expected to
-// pass around ScriptState in the code base. ScriptState is in a 1:1
-// relationship with v8::Context.
-//
-// When you need ScriptState, you can add [CallWith=ScriptState] to IDL files
-// and pass around ScriptState into a place where you need ScriptState.
-//
-// In some cases, you need ScriptState in code that doesn't have any JavaScript
-// on the stack. Then you can store ScriptState on a C++ object using
-// RefPtr<ScriptState>.
-//
-// class SomeObject {
-// void someMethod(ScriptState* scriptState) {
-// m_scriptState = scriptState; // Record the ScriptState.
-// ...;
-// }
-//
-// void asynchronousMethod() {
-// if (!m_scriptState->contextIsValid()) {
-// // It's possible that the context is already gone.
-// return;
-// }
-// // Enter the ScriptState.
-// ScriptState::Scope scope(m_scriptState.get());
-// // Do V8 related things.
-// ToV8(...);
-// }
-// RefPtr<ScriptState> m_scriptState;
-// };
-//
-// You should not store ScriptState on a C++ object that can be accessed
-// by multiple worlds. For example, you can store ScriptState on
-// ScriptPromiseResolver, ScriptValue etc because they can be accessed from one
-// world. However, you cannot store ScriptState on a DOM object that has
-// an IDL interface because the DOM object can be accessed from multiple
-// worlds. If ScriptState of one world "leak"s to another world, you will
-// end up with leaking any JavaScript objects from one Chrome extension
-// to another Chrome extension, which is a severe security bug.
-//
-// Lifetime:
-// ScriptState is created when v8::Context is created.
-// ScriptState is destroyed when v8::Context is garbage-collected and
-// all V8 proxy objects that have references to the ScriptState are destructed.
-class CORE_EXPORT ScriptState : public RefCounted<ScriptState> {
- WTF_MAKE_NONCOPYABLE(ScriptState);
-
- public:
- class Scope {
- STACK_ALLOCATED();
-
- public:
- // You need to make sure that scriptState->context() is not empty before
- // creating a Scope.
- explicit Scope(ScriptState* script_state)
- : handle_scope_(script_state->GetIsolate()),
- context_(script_state->GetContext()) {
- DCHECK(script_state->ContextIsValid());
- context_->Enter();
- }
-
- ~Scope() { context_->Exit(); }
-
- private:
- v8::HandleScope handle_scope_;
- v8::Local<v8::Context> context_;
- };
-
- static PassRefPtr<ScriptState> Create(v8::Local<v8::Context>,
- PassRefPtr<DOMWrapperWorld>);
- virtual ~ScriptState();
-
- static ScriptState* Current(v8::Isolate* isolate) // DEPRECATED
- {
- return From(isolate->GetCurrentContext());
- }
-
- static ScriptState* ForFunctionObject(
- const v8::FunctionCallbackInfo<v8::Value>& info) {
- // We're assuming that the current context is not yet changed since
- // the callback function has got called back.
- // TODO(yukishiino): Once info.GetFunctionContext() gets implemented,
- // we should use it instead.
- return From(info.GetIsolate()->GetCurrentContext());
- }
-
- static ScriptState* ForReceiverObject(
- const v8::FunctionCallbackInfo<v8::Value>& info) {
- return From(info.Holder()->CreationContext());
- }
-
- static ScriptState* ForReceiverObject(
- const v8::PropertyCallbackInfo<v8::Value>& info) {
- return From(info.Holder()->CreationContext());
- }
-
- static ScriptState* ForReceiverObject(
- const v8::PropertyCallbackInfo<void>& info) {
- return From(info.Holder()->CreationContext());
- }
-
- static ScriptState* From(v8::Local<v8::Context> context) {
- DCHECK(!context.IsEmpty());
- ScriptState* script_state =
- static_cast<ScriptState*>(context->GetAlignedPointerFromEmbedderData(
- kV8ContextPerContextDataIndex));
- // ScriptState::from() must not be called for a context that does not have
- // valid embedder data in the embedder field.
- SECURITY_CHECK(script_state);
- SECURITY_CHECK(script_state->GetContext() == context);
- return script_state;
- }
-
- v8::Isolate* GetIsolate() const { return isolate_; }
- DOMWrapperWorld& World() const { return *world_; }
-
- // This can return an empty handle if the v8::Context is gone.
- v8::Local<v8::Context> GetContext() const {
- return context_.NewLocal(isolate_);
- }
- bool ContextIsValid() const {
- return !context_.IsEmpty() && per_context_data_;
- }
- void DetachGlobalObject();
- void ClearContext() { return context_.Clear(); }
-
- V8PerContextData* PerContextData() const { return per_context_data_.get(); }
- void DisposePerContextData();
-
- protected:
- ScriptState(v8::Local<v8::Context>, PassRefPtr<DOMWrapperWorld>);
-
- private:
- v8::Isolate* isolate_;
- // This persistent handle is weak.
- ScopedPersistent<v8::Context> context_;
-
- // This RefPtr doesn't cause a cycle because all persistent handles that
- // DOMWrapperWorld holds are weak.
- RefPtr<DOMWrapperWorld> world_;
-
- // This std::unique_ptr causes a cycle:
- // V8PerContextData --(Persistent)--> v8::Context --(RefPtr)--> ScriptState
- // --(std::unique_ptr)--> V8PerContextData
- // So you must explicitly clear the std::unique_ptr by calling
- // disposePerContextData() once you no longer need V8PerContextData.
- // Otherwise, the v8::Context will leak.
- std::unique_ptr<V8PerContextData> per_context_data_;
-};
-
-// ScriptStateProtectingContext keeps the context associated with the
-// ScriptState alive. You need to call clear() once you no longer need the
-// context. Otherwise, the context will leak.
-class ScriptStateProtectingContext {
- WTF_MAKE_NONCOPYABLE(ScriptStateProtectingContext);
- USING_FAST_MALLOC(ScriptStateProtectingContext);
-
- public:
- ScriptStateProtectingContext(ScriptState* script_state)
- : script_state_(script_state) {
- if (script_state_)
- context_.Set(script_state_->GetIsolate(), script_state_->GetContext());
- }
-
- ScriptState* operator->() const { return script_state_.Get(); }
- ScriptState* Get() const { return script_state_.Get(); }
- void Clear() {
- script_state_ = nullptr;
- context_.Clear();
- }
-
- private:
- RefPtr<ScriptState> script_state_;
- ScopedPersistent<v8::Context> context_;
-};
-
-} // namespace blink
-
-#endif // ScriptState_h
+// This file has been moved to platform/bindings/ScriptState.h.
+// TODO(adithyas): Remove this file.
+#include "platform/bindings/ScriptState.h"

Powered by Google App Engine
This is Rietveld 408576698