blob: 43233585064eb0271dc5f572f725d6053dfbe4b7 [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 V8ContextSnapshot_h
#define V8ContextSnapshot_h
#include "core/CoreExport.h"
#include "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*);
// Install runtime enabled features on some v8::Object's in a context
// created from a snapshot.
static void InstallRuntimeEnabledFeatures(v8::Local<v8::Context>, Document*);
static void EnsureInterfaceTemplates(v8::Isolate*);
static void SetReferenceTable(intptr_t* table);
static intptr_t* GetReferenceTable();
// 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 // V8ContextSnapshot_h