Chromium Code Reviews| Index: third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp |
| diff --git a/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp b/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp |
| index d8c2cd101c1a4d38de65d939beee3e7c39063e5d..1373635e1557307d21c3df438c1bf981d8029d79 100644 |
| --- a/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp |
| +++ b/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp |
| @@ -39,6 +39,7 @@ |
| #include "bindings/core/v8/V8HTMLDocument.h" |
| #include "bindings/core/v8/V8Initializer.h" |
| #include "bindings/core/v8/V8PagePopupControllerBinding.h" |
| +#include "bindings/core/v8/V8SnapshotUtil.h" |
| #include "bindings/core/v8/V8Window.h" |
| #include "core/dom/Modulator.h" |
| #include "core/frame/LocalFrame.h" |
| @@ -117,7 +118,7 @@ void LocalWindowProxy::DisposeContext(Lifecycle next_status) { |
| } |
| void LocalWindowProxy::Initialize() { |
| - TRACE_EVENT1("v8", "LocalWindowProxy::initialize", "isMainWindow", |
| + TRACE_EVENT1("v8", "LocalWindowProxy::Initialize", "IsMainFrame", |
| GetFrame()->IsMainFrame()); |
| SCOPED_BLINK_UMA_HISTOGRAM_TIMER( |
| GetFrame()->IsMainFrame() |
| @@ -138,6 +139,7 @@ void LocalWindowProxy::Initialize() { |
| } |
| SetupWindowPrototypeChain(); |
| + V8SnapshotUtil::SetupContext(context, GetFrame()->GetDocument()); |
| SecurityOrigin* origin = 0; |
| if (world_->IsMainWorld()) { |
| @@ -158,26 +160,25 @@ void LocalWindowProxy::Initialize() { |
| SetSecurityToken(origin); |
| } |
| - MainThreadDebugger::Instance()->ContextCreated(script_state_.Get(), |
| - GetFrame(), origin); |
| - GetFrame()->Loader().Client()->DidCreateScriptContext(context, |
| - world_->GetWorldId()); |
| - // If conditional features for window have been queued before the V8 context |
| - // was ready, then inject them into the context now |
| - if (world_->IsMainWorld()) { |
| - InstallConditionalFeaturesOnWindow(script_state_.Get()); |
| + { |
| + TRACE_EVENT1("v8", "Notification", "IsMainFrame", |
| + GetFrame()->IsMainFrame()); |
| + MainThreadDebugger::Instance()->ContextCreated(script_state_.Get(), |
| + GetFrame(), origin); |
| + GetFrame()->Loader().Client()->DidCreateScriptContext(context, |
| + world_->GetWorldId()); |
| + // If conditional features for window have been queued before the V8 context |
| + // was ready, then inject them into the context now |
| + if (world_->IsMainWorld()) { |
| + InstallConditionalFeaturesOnWindow(script_state_.Get()); |
| + GetFrame()->Loader().DispatchDidClearWindowObjectInMainWorld(); |
| + } |
| } |
| - |
| - if (world_->IsMainWorld()) |
| - GetFrame()->Loader().DispatchDidClearWindowObjectInMainWorld(); |
| } |
| void LocalWindowProxy::CreateContext() { |
| - // Create a new v8::Context with the window object as the global object |
| - // (aka the inner global). Reuse the outer global proxy if it already exists. |
| - v8::Local<v8::ObjectTemplate> global_template = |
| - V8Window::domTemplate(GetIsolate(), *world_)->InstanceTemplate(); |
| - CHECK(!global_template.IsEmpty()); |
| + TRACE_EVENT1("v8", "LocalWindowProxy::CreateContext", "IsMainFrame", |
| + GetFrame()->IsMainFrame()); |
| Vector<const char*> extension_names; |
| // Dynamically tell v8 about our extensions now. |
| @@ -192,11 +193,25 @@ void LocalWindowProxy::CreateContext() { |
| v8::Local<v8::Context> context; |
| { |
| + v8::Isolate* isolate = GetIsolate(); |
| + Document* document = GetFrame()->GetDocument(); |
| V8PerIsolateData::UseCounterDisabledScope use_counter_disabled( |
| - V8PerIsolateData::From(GetIsolate())); |
| - context = |
| - v8::Context::New(GetIsolate(), &extension_configuration, |
| - global_template, global_proxy_.NewLocal(GetIsolate())); |
| + V8PerIsolateData::From(isolate)); |
| + TRACE_EVENT1("v8", "ContextCreation", "IsMainFrame", |
| + GetFrame()->IsMainFrame()); |
| + |
| + v8::Local<v8::Object> global_proxy = global_proxy_.NewLocal(isolate); |
| + context = V8SnapshotUtil::CreateContext( |
| + isolate, World(), &extension_configuration, global_proxy, document); |
| + |
| + if (context.IsEmpty()) { |
| + v8::Local<v8::ObjectTemplate> global_template = |
| + V8Window::domTemplate(isolate, *world_)->InstanceTemplate(); |
| + CHECK(!global_template.IsEmpty()); |
| + context = v8::Context::New(isolate, &extension_configuration, |
| + global_template, global_proxy); |
| + DLOG(INFO) << "A context is created NOT from snapshot"; |
| + } |
| } |
| CHECK(!context.IsEmpty()); |
| @@ -213,6 +228,9 @@ void LocalWindowProxy::CreateContext() { |
| } |
| void LocalWindowProxy::SetupWindowPrototypeChain() { |
| + TRACE_EVENT1("v8", "LocalWindowProxy::SetupWindowPrototypeChain", |
| + "IsMainFrame", GetFrame()->IsMainFrame()); |
| + |
| // Associate the window wrapper object and its prototype chain with the |
| // corresponding native DOMWindow object. |
| DOMWindow* window = GetFrame()->DomWindow(); |
| @@ -249,6 +267,17 @@ void LocalWindowProxy::SetupWindowPrototypeChain() { |
| V8DOMWrapper::SetNativeInfo(GetIsolate(), window_properties, |
| wrapper_type_info, window); |
| + { |
| + // In case using the snapshot, we need to install runtime enabled features |
| + // on prototype objects and interface objects for ancestors of HTMLDocument |
| + // and Window. |
|
Yuki
2017/06/23 15:20:44
I think that now we don't need these lines of code
peria
2017/06/27 09:52:37
Done.
|
| + v8::Context::Scope scope(context); |
| + script_state_->PerContextData()->ConstructorForType( |
| + &V8HTMLDocument::wrapperTypeInfo); |
| + script_state_->PerContextData()->ConstructorForType( |
| + &V8Window::wrapperTypeInfo); |
| + } |
| + |
| // TODO(keishi): Remove installPagePopupController and implement |
| // PagePopupController in another way. |
| V8PagePopupControllerBinding::InstallPagePopupController(context, |
| @@ -257,12 +286,15 @@ void LocalWindowProxy::SetupWindowPrototypeChain() { |
| void LocalWindowProxy::UpdateDocumentProperty() { |
| DCHECK(world_->IsMainWorld()); |
| + TRACE_EVENT1("v8", "LocalWindowProxy::UpdateDocumentProperty", "IsMainFrame", |
| + GetFrame()->IsMainFrame()); |
| ScriptState::Scope scope(script_state_.Get()); |
| v8::Local<v8::Context> context = script_state_->GetContext(); |
| v8::Local<v8::Value> document_wrapper = |
| ToV8(GetFrame()->GetDocument(), context->Global(), GetIsolate()); |
| DCHECK(document_wrapper->IsObject()); |
| + |
| // Update the cached accessor for window.document. |
| CHECK(V8PrivateProperty::GetWindowDocumentCachedAccessor(GetIsolate()) |
| .Set(context->Global(), document_wrapper)); |
| @@ -324,8 +356,8 @@ void LocalWindowProxy::SetSecurityToken(SecurityOrigin* origin) { |
| String frame_security_token = frame_security_origin->ToString(); |
| // We need to check the return value of domainWasSetInDOM() on the |
| // frame's SecurityOrigin because, if that's the case, only |
| - // SecurityOrigin::m_domain would have been modified. |
| - // m_domain is not used by SecurityOrigin::toString(), so we would end |
| + // SecurityOrigin::domain_ would have been modified. |
| + // domain_ is not used by SecurityOrigin::toString(), so we would end |
| // up generating the same token that was already set. |
| if (frame_security_origin->DomainWasSetInDOM() || |
| frame_security_token.IsEmpty() || frame_security_token == "null") { |