blob: 54609ee334414f6e3c1fa154bb7217ab2d15eceb [file] [log] [blame]
// 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.
#ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_CONTEXT_SNAPSHOT_H_
#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_CONTEXT_SNAPSHOT_H_
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/platform/wtf/allocator.h"
#include "v8/include/v8.h"
namespace blink {
class Document;
class DOMWrapperWorld;
// This class contains helper functions to take and use a V8 context snapshot.
//
// The V8 context snapshot is taken by tools/v8_context_snapshot/ when Chromium
// is built, and is used when Blink creates a new V8 context. When to build or
// to use the V8 context snapshot, you have a table of references of C++
// callbacks exposed to V8.
//
// A V8 context snapshot contains:
// - Interface templates of Window, EventTarget, Node, Document, and
// HTMLDocument.
// - Two types of V8 contexts; one is for the main world, and the other is for
// other worlds.
// - HTMLDocument's wrapper (window.document) in the context for the main
// world.
//
// Currently, the V8 context snapshot supports only the main thread. If it is
// the main world, we need a special logic to serialize / deserialize
// window.document (so only HTMLDocument is supported on the main world).
// Worker threads are not yet supported.
class CORE_EXPORT V8ContextSnapshot {
STATIC_ONLY(V8ContextSnapshot);
public:
static v8::Local<v8::Context> CreateContextFromSnapshot(
v8::Isolate*,
const DOMWrapperWorld&,
v8::ExtensionConfiguration*,
v8::Local<v8::Object> global_proxy,
Document*);
// If the context was created from the snapshot, installs conditionally
// enabled features on some v8::Object's in the context and returns true.
// Otherwise, does nothing and returns false.
static bool InstallConditionalFeatures(v8::Local<v8::Context>, Document*);
static void EnsureInterfaceTemplates(v8::Isolate*);
// Do not call this in production.
static v8::StartupData TakeSnapshot();
private:
static v8::StartupData SerializeInternalField(v8::Local<v8::Object> holder,
int index,
void* data);
static void DeserializeInternalField(v8::Local<v8::Object> holder,
int index,
v8::StartupData payload,
void* data);
static bool CanCreateContextFromSnapshot(v8::Isolate*,
const DOMWrapperWorld&,
Document*);
static void EnsureInterfaceTemplatesForWorld(v8::Isolate*,
const DOMWrapperWorld&);
static void TakeSnapshotForWorld(v8::SnapshotCreator*,
const DOMWrapperWorld&);
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_CONTEXT_SNAPSHOT_H_