diff options
Diffstat (limited to 'Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.cpp')
-rw-r--r-- | Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.cpp | 62 |
1 files changed, 38 insertions, 24 deletions
diff --git a/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.cpp b/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.cpp index 0a9b88ada..4f8b84535 100644 --- a/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.cpp +++ b/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.cpp @@ -21,12 +21,12 @@ #include "config.h" #include "V8TestActiveDOMObject.h" +#include "BindingState.h" #include "ContextFeatures.h" #include "ExceptionCode.h" +#include "Frame.h" #include "RuntimeEnabledFeatures.h" #include "V8Binding.h" -#include "V8BindingMacros.h" -#include "V8BindingState.h" #include "V8DOMWrapper.h" #include "V8IsolatedContext.h" #include "V8Node.h" @@ -54,11 +54,11 @@ static v8::Handle<v8::Value> excitingFunctionCallback(const v8::Arguments& args) if (args.Length() < 1) return V8Proxy::throwNotEnoughArgumentsError(args.GetIsolate()); TestActiveDOMObject* imp = V8TestActiveDOMObject::toNative(args.Holder()); - if (!V8BindingSecurity::canAccessFrame(V8BindingState::Only(), imp->frame(), true)) - return v8::Handle<v8::Value>(); + if (!BindingSecurity::shouldAllowAccessToFrame(BindingState::instance(), imp->frame())) + return v8Undefined(); EXCEPTION_BLOCK(Node*, nextChild, V8Node::HasInstance(MAYBE_MISSING_PARAMETER(args, 0, DefaultIsUndefined)) ? V8Node::toNative(v8::Handle<v8::Object>::Cast(MAYBE_MISSING_PARAMETER(args, 0, DefaultIsUndefined))) : 0); imp->excitingFunction(nextChild); - return v8::Handle<v8::Value>(); + return v8Undefined(); } static v8::Handle<v8::Value> postMessageCallback(const v8::Arguments& args) @@ -69,13 +69,13 @@ static v8::Handle<v8::Value> postMessageCallback(const v8::Arguments& args) TestActiveDOMObject* imp = V8TestActiveDOMObject::toNative(args.Holder()); STRING_TO_V8PARAMETER_EXCEPTION_BLOCK(V8Parameter<>, message, MAYBE_MISSING_PARAMETER(args, 0, DefaultIsUndefined)); imp->postMessage(message); - return v8::Handle<v8::Value>(); + return v8Undefined(); } static v8::Handle<v8::Value> postMessageAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { INC_STATS("DOM.TestActiveDOMObject.postMessage._get"); - static v8::Persistent<v8::FunctionTemplate> privateTemplate = v8::Persistent<v8::FunctionTemplate>::New(v8::FunctionTemplate::New(TestActiveDOMObjectV8Internal::postMessageCallback, v8::Handle<v8::Value>(), v8::Signature::New(V8TestActiveDOMObject::GetRawTemplate()))); + static v8::Persistent<v8::FunctionTemplate> privateTemplate = v8::Persistent<v8::FunctionTemplate>::New(v8::FunctionTemplate::New(TestActiveDOMObjectV8Internal::postMessageCallback, v8Undefined(), v8::Signature::New(V8TestActiveDOMObject::GetRawTemplate()))); v8::Handle<v8::Object> holder = V8DOMWrapper::lookupDOMWrapper(V8TestActiveDOMObject::GetTemplate(), info.This()); if (holder.IsEmpty()) { // can only reach here by 'object.__proto__.func', and it should passed @@ -83,16 +83,34 @@ static v8::Handle<v8::Value> postMessageAttrGetter(v8::Local<v8::String> name, c return privateTemplate->GetFunction(); } TestActiveDOMObject* imp = V8TestActiveDOMObject::toNative(holder); - if (!V8BindingSecurity::canAccessFrame(V8BindingState::Only(), imp->frame(), false)) { - static v8::Persistent<v8::FunctionTemplate> sharedTemplate = v8::Persistent<v8::FunctionTemplate>::New(v8::FunctionTemplate::New(TestActiveDOMObjectV8Internal::postMessageCallback, v8::Handle<v8::Value>(), v8::Signature::New(V8TestActiveDOMObject::GetRawTemplate()))); + if (!BindingSecurity::shouldAllowAccessToFrame(BindingState::instance(), imp->frame(), DoNotReportSecurityError)) { + static v8::Persistent<v8::FunctionTemplate> sharedTemplate = v8::Persistent<v8::FunctionTemplate>::New(v8::FunctionTemplate::New(TestActiveDOMObjectV8Internal::postMessageCallback, v8Undefined(), v8::Signature::New(V8TestActiveDOMObject::GetRawTemplate()))); return sharedTemplate->GetFunction(); } + + v8::Local<v8::Value> hiddenValue = info.This()->GetHiddenValue(name); + if (!hiddenValue.IsEmpty()) + return hiddenValue; + return privateTemplate->GetFunction(); } +static void TestActiveDOMObjectDomainSafeFunctionSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info) +{ + INC_STATS("DOM.TestActiveDOMObject._set"); + v8::Handle<v8::Object> holder = V8DOMWrapper::lookupDOMWrapper(V8TestActiveDOMObject::GetTemplate(), info.This()); + if (holder.IsEmpty()) + return; + TestActiveDOMObject* imp = V8TestActiveDOMObject::toNative(holder); + if (!BindingSecurity::shouldAllowAccessToFrame(BindingState::instance(), imp->frame())) + return; + + info.This()->SetHiddenValue(name, value); +} + } // namespace TestActiveDOMObjectV8Internal -static const BatchedAttribute TestActiveDOMObjectAttrs[] = { +static const V8DOMConfiguration::BatchedAttribute TestActiveDOMObjectAttrs[] = { // Attribute 'excitingAttr' (Type: 'readonly attribute' ExtAttr: '') {"excitingAttr", TestActiveDOMObjectV8Internal::excitingAttrAttrGetter, 0, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */}, }; @@ -102,7 +120,7 @@ static v8::Persistent<v8::FunctionTemplate> ConfigureV8TestActiveDOMObjectTempla desc->ReadOnlyPrototype(); v8::Local<v8::Signature> defaultSignature; - defaultSignature = configureTemplate(desc, "TestActiveDOMObject", v8::Persistent<v8::FunctionTemplate>(), V8TestActiveDOMObject::internalFieldCount, + defaultSignature = V8DOMConfiguration::configureTemplate(desc, "TestActiveDOMObject", v8::Persistent<v8::FunctionTemplate>(), V8TestActiveDOMObject::internalFieldCount, TestActiveDOMObjectAttrs, WTF_ARRAY_LENGTH(TestActiveDOMObjectAttrs), 0, 0); UNUSED_PARAM(defaultSignature); // In some cases, it will not be used. @@ -116,10 +134,10 @@ static v8::Persistent<v8::FunctionTemplate> ConfigureV8TestActiveDOMObjectTempla const int excitingFunctionArgc = 1; v8::Handle<v8::FunctionTemplate> excitingFunctionArgv[excitingFunctionArgc] = { V8Node::GetRawTemplate() }; v8::Handle<v8::Signature> excitingFunctionSignature = v8::Signature::New(desc, excitingFunctionArgc, excitingFunctionArgv); - proto->Set(v8::String::New("excitingFunction"), v8::FunctionTemplate::New(TestActiveDOMObjectV8Internal::excitingFunctionCallback, v8::Handle<v8::Value>(), excitingFunctionSignature)); + proto->Set(v8::String::New("excitingFunction"), v8::FunctionTemplate::New(TestActiveDOMObjectV8Internal::excitingFunctionCallback, v8Undefined(), excitingFunctionSignature)); // Function 'postMessage' (ExtAttr: 'DoNotCheckSecurity') - proto->SetAccessor(v8::String::New("postMessage"), TestActiveDOMObjectV8Internal::postMessageAttrGetter, 0, v8::Handle<v8::Value>(), v8::ALL_CAN_READ, static_cast<v8::PropertyAttribute>(v8::DontDelete | v8::ReadOnly)); + proto->SetAccessor(v8::String::New("postMessage"), TestActiveDOMObjectV8Internal::postMessageAttrGetter, TestActiveDOMObjectV8Internal::TestActiveDOMObjectDomainSafeFunctionSetter, v8Undefined(), v8::ALL_CAN_READ, static_cast<v8::PropertyAttribute>(v8::DontDelete)); // Custom toString template desc->Set(getToStringName(), getToStringTemplate()); @@ -128,8 +146,8 @@ static v8::Persistent<v8::FunctionTemplate> ConfigureV8TestActiveDOMObjectTempla v8::Persistent<v8::FunctionTemplate> V8TestActiveDOMObject::GetRawTemplate() { - V8BindingPerIsolateData* data = V8BindingPerIsolateData::current(); - V8BindingPerIsolateData::TemplateMap::iterator result = data->rawTemplateMap().find(&info); + V8PerIsolateData* data = V8PerIsolateData::current(); + V8PerIsolateData::TemplateMap::iterator result = data->rawTemplateMap().find(&info); if (result != data->rawTemplateMap().end()) return result->second; @@ -141,8 +159,8 @@ v8::Persistent<v8::FunctionTemplate> V8TestActiveDOMObject::GetRawTemplate() v8::Persistent<v8::FunctionTemplate> V8TestActiveDOMObject::GetTemplate() { - V8BindingPerIsolateData* data = V8BindingPerIsolateData::current(); - V8BindingPerIsolateData::TemplateMap::iterator result = data->templateMap().find(&info); + V8PerIsolateData* data = V8PerIsolateData::current(); + V8PerIsolateData::TemplateMap::iterator result = data->templateMap().find(&info); if (result != data->templateMap().end()) return result->second; @@ -164,9 +182,8 @@ v8::Handle<v8::Object> V8TestActiveDOMObject::wrapSlow(PassRefPtr<TestActiveDOMO v8::Handle<v8::Object> wrapper; V8Proxy* proxy = 0; if (impl->frame()) { - proxy = V8Proxy::retrieve(impl->frame()); - if (proxy) - proxy->windowShell()->initContextIfNeeded(); + proxy = impl->frame()->script()->proxy(); + proxy->windowShell()->initContextIfNeeded(); } // Enter the node's context and create the wrapper in that context. @@ -184,12 +201,9 @@ v8::Handle<v8::Object> V8TestActiveDOMObject::wrapSlow(PassRefPtr<TestActiveDOMO context->Exit(); if (UNLIKELY(wrapper.IsEmpty())) return wrapper; - - v8::Persistent<v8::Object> wrapperHandle = v8::Persistent<v8::Object>::New(wrapper); - + v8::Persistent<v8::Object> wrapperHandle = V8DOMWrapper::setJSWrapperForDOMObject(impl, wrapper, isolate); if (!hasDependentLifetime) wrapperHandle.MarkIndependent(); - V8DOMWrapper::setJSWrapperForDOMObject(impl, wrapperHandle, isolate); return wrapper; } |