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

Unified Diff: third_party/WebKit/Source/platform/bindings/V8PerIsolateData.h

Issue 2841443005: [Bindings] Create and use V8 context snapshots (Closed)
Patch Set: Rebase Created 3 years, 5 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/platform/bindings/V8PerIsolateData.h
diff --git a/third_party/WebKit/Source/platform/bindings/V8PerIsolateData.h b/third_party/WebKit/Source/platform/bindings/V8PerIsolateData.h
index 8af0f25c01ae503b222213bf66bf7fabf2d31bc4..2e52788a19eca743f453b095e2c51f8235c2c404 100644
--- a/third_party/WebKit/Source/platform/bindings/V8PerIsolateData.h
+++ b/third_party/WebKit/Source/platform/bindings/V8PerIsolateData.h
@@ -60,6 +60,12 @@ class PLATFORM_EXPORT V8PerIsolateData {
WTF_MAKE_NONCOPYABLE(V8PerIsolateData);
public:
+ enum class V8ContextSnapshotMode {
+ kTakeSnapshot,
+ kDontUseSnapshot,
+ kUseSnapshot,
+ };
+
class EndOfScopeTask {
USING_FAST_MALLOC(EndOfScopeTask);
@@ -101,7 +107,9 @@ class PLATFORM_EXPORT V8PerIsolateData {
virtual ~Data() = default;
};
- static v8::Isolate* Initialize(WebTaskRunner*);
+ static v8::Isolate* Initialize(WebTaskRunner*,
+ intptr_t* refernce_table,
+ V8ContextSnapshotMode);
static V8PerIsolateData* From(v8::Isolate* isolate) {
DCHECK(isolate);
@@ -144,6 +152,17 @@ class PLATFORM_EXPORT V8PerIsolateData {
const void* key,
v8::Local<v8::FunctionTemplate>);
+ // When v8::SnapshotCreator::CreateBlob() is called, we must not have
+ // persistent handles in Blink. This method clears them.
+ void ClearPersistentsForV8ContextSnapshot();
+
+ v8::SnapshotCreator* GetSnapshotCreator() const {
+ return isolate_holder_.snapshot_creator();
+ }
+ V8ContextSnapshotMode GetV8ContextSnapshotMode() const {
+ return v8_context_snapshot_mode_;
+ }
+
// Accessor to the cache of cross-origin accessible operation's templates.
// Created templates get automatically cached.
v8::Local<v8::FunctionTemplate> FindOrCreateOperationTemplate(
@@ -224,11 +243,14 @@ class PLATFORM_EXPORT V8PerIsolateData {
}
private:
- explicit V8PerIsolateData(WebTaskRunner*);
+ V8PerIsolateData(WebTaskRunner*,
+ intptr_t* reference_table,
+ V8ContextSnapshotMode);
+ explicit V8PerIsolateData(intptr_t* reference_table);
~V8PerIsolateData();
- typedef HashMap<const void*, v8::Eternal<v8::FunctionTemplate>>
- V8FunctionTemplateMap;
+ using V8FunctionTemplateMap =
+ HashMap<const void*, v8::Eternal<v8::FunctionTemplate>>;
V8FunctionTemplateMap& SelectInterfaceTemplateMap(const DOMWrapperWorld&);
V8FunctionTemplateMap& SelectOperationTemplateMap(const DOMWrapperWorld&);
bool HasInstance(const WrapperTypeInfo* untrusted,
@@ -238,12 +260,16 @@ class PLATFORM_EXPORT V8PerIsolateData {
v8::Local<v8::Value>,
V8FunctionTemplateMap&);
+ V8ContextSnapshotMode v8_context_snapshot_mode_;
+ // This isolate_holder_ must be initialized before initializing some other
+ // members below.
gin::IsolateHolder isolate_holder_;
- // m_interfaceTemplateMapFor{,Non}MainWorld holds function templates for
+ // interface_template_map_for_{,non_}main_world holds function templates for
// the inerface objects.
V8FunctionTemplateMap interface_template_map_for_main_world_;
V8FunctionTemplateMap interface_template_map_for_non_main_world_;
+
// m_operationTemplateMapFor{,Non}MainWorld holds function templates for
// the cross-origin accessible DOM operations.
V8FunctionTemplateMap operation_template_map_for_main_world_;
@@ -252,6 +278,16 @@ class PLATFORM_EXPORT V8PerIsolateData {
// Contains lists of eternal names, such as dictionary keys.
HashMap<const void*, Vector<v8::Eternal<v8::Name>>> eternal_name_cache_;
+ // Members required for the V8 context snapshot.
+ // v8::Context is created from this blob data image. This needs to be
+ // instantiated before |isolate_holder_| gets instantiated.
+ v8::StartupData startup_data_;
+ // When taking a V8 context snapshot, we can't keep V8 objects with eternal
+ // handles. So we use a special interface map that doesn't use eternal handles
+ // instead of the default V8FunctionTemplateMap.
+ V8GlobalValueMap<const WrapperTypeInfo*, v8::FunctionTemplate, v8::kNotWeak>
+ interface_template_map_for_v8_context_snapshot_;
+
std::unique_ptr<StringCache> string_cache_;
std::unique_ptr<V8PrivateProperty> private_property_;
RefPtr<ScriptState> script_regexp_script_state_;

Powered by Google App Engine
This is Rietveld 408576698