1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
// Copyright 2013 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 "gin/per_isolate_data.h"
#include <utility>
#include "base/logging.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "gin/public/gin_embedders.h"
using v8::ArrayBuffer;
using v8::Eternal;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::FunctionTemplate;
using v8::ObjectTemplate;
namespace gin {
PerIsolateData::PerIsolateData(
Isolate* isolate,
ArrayBuffer::Allocator* allocator,
IsolateHolder::AccessMode access_mode,
scoped_refptr<base::SingleThreadTaskRunner> task_runner)
: isolate_(isolate),
allocator_(allocator),
access_mode_(access_mode),
task_runner_(
task_runner ? task_runner : base::ThreadTaskRunnerHandle::Get()) {
isolate_->SetData(kEmbedderNativeGin, this);
}
PerIsolateData::~PerIsolateData() {
isolate_->SetData(kEmbedderNativeGin, NULL);
}
PerIsolateData* PerIsolateData::From(Isolate* isolate) {
return static_cast<PerIsolateData*>(isolate->GetData(kEmbedderNativeGin));
}
void PerIsolateData::SetObjectTemplate(WrapperInfo* info,
Local<ObjectTemplate> templ) {
object_templates_[info] = Eternal<ObjectTemplate>(isolate_, templ);
}
void PerIsolateData::SetFunctionTemplate(WrapperInfo* info,
Local<FunctionTemplate> templ) {
function_templates_[info] = Eternal<FunctionTemplate>(isolate_, templ);
}
v8::Local<v8::ObjectTemplate> PerIsolateData::GetObjectTemplate(
WrapperInfo* info) {
ObjectTemplateMap::iterator it = object_templates_.find(info);
if (it == object_templates_.end())
return v8::Local<v8::ObjectTemplate>();
return it->second.Get(isolate_);
}
v8::Local<v8::FunctionTemplate> PerIsolateData::GetFunctionTemplate(
WrapperInfo* info) {
FunctionTemplateMap::iterator it = function_templates_.find(info);
if (it == function_templates_.end())
return v8::Local<v8::FunctionTemplate>();
return it->second.Get(isolate_);
}
void PerIsolateData::SetIndexedPropertyInterceptor(
WrappableBase* base,
IndexedPropertyInterceptor* interceptor) {
indexed_interceptors_[base] = interceptor;
}
void PerIsolateData::SetNamedPropertyInterceptor(
WrappableBase* base,
NamedPropertyInterceptor* interceptor) {
named_interceptors_[base] = interceptor;
}
void PerIsolateData::ClearIndexedPropertyInterceptor(
WrappableBase* base,
IndexedPropertyInterceptor* interceptor) {
IndexedPropertyInterceptorMap::iterator it = indexed_interceptors_.find(base);
if (it != indexed_interceptors_.end())
indexed_interceptors_.erase(it);
else
NOTREACHED();
}
void PerIsolateData::ClearNamedPropertyInterceptor(
WrappableBase* base,
NamedPropertyInterceptor* interceptor) {
NamedPropertyInterceptorMap::iterator it = named_interceptors_.find(base);
if (it != named_interceptors_.end())
named_interceptors_.erase(it);
else
NOTREACHED();
}
IndexedPropertyInterceptor* PerIsolateData::GetIndexedPropertyInterceptor(
WrappableBase* base) {
IndexedPropertyInterceptorMap::iterator it = indexed_interceptors_.find(base);
if (it != indexed_interceptors_.end())
return it->second;
else
return NULL;
}
NamedPropertyInterceptor* PerIsolateData::GetNamedPropertyInterceptor(
WrappableBase* base) {
NamedPropertyInterceptorMap::iterator it = named_interceptors_.find(base);
if (it != named_interceptors_.end())
return it->second;
else
return NULL;
}
void PerIsolateData::EnableIdleTasks(
std::unique_ptr<V8IdleTaskRunner> idle_task_runner) {
idle_task_runner_ = std::move(idle_task_runner);
}
} // namespace gin
|