diff options
| author | Steve Block <steveblock@google.com> | 2011-05-25 19:08:45 +0100 | 
|---|---|---|
| committer | Steve Block <steveblock@google.com> | 2011-06-08 13:51:31 +0100 | 
| commit | 2bde8e466a4451c7319e3a072d118917957d6554 (patch) | |
| tree | 28f4a1b869a513e565c7760d0e6a06e7cf1fe95a /Source/WebCore/bindings/v8/custom | |
| parent | 6939c99b71d9372d14a0c74a772108052e8c48c8 (diff) | |
| download | external_webkit-2bde8e466a4451c7319e3a072d118917957d6554.zip external_webkit-2bde8e466a4451c7319e3a072d118917957d6554.tar.gz external_webkit-2bde8e466a4451c7319e3a072d118917957d6554.tar.bz2 | |
Merge WebKit at r82507: Initial merge by git
Change-Id: I60ce9d780725b58b45e54165733a8ffee23b683e
Diffstat (limited to 'Source/WebCore/bindings/v8/custom')
6 files changed, 233 insertions, 137 deletions
| diff --git a/Source/WebCore/bindings/v8/custom/V8HTMLCanvasElementCustom.cpp b/Source/WebCore/bindings/v8/custom/V8HTMLCanvasElementCustom.cpp index 8fd2d62..52465b6 100644 --- a/Source/WebCore/bindings/v8/custom/V8HTMLCanvasElementCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8HTMLCanvasElementCustom.cpp @@ -76,6 +76,9 @@ v8::Handle<v8::Value> V8HTMLCanvasElement::getContextCallback(const v8::Argument              v8::Handle<v8::String> premultipliedAlpha = v8::String::New("premultipliedAlpha");              if (jsAttrs->Has(premultipliedAlpha))                  webGLAttrs->setPremultipliedAlpha(jsAttrs->Get(premultipliedAlpha)->BooleanValue()); +            v8::Handle<v8::String> preserveDrawingBuffer = v8::String::New("preserveDrawingBuffer"); +            if (jsAttrs->Has(preserveDrawingBuffer)) +                webGLAttrs->setPreserveDrawingBuffer(jsAttrs->Get(preserveDrawingBuffer)->BooleanValue());          }      }  #endif diff --git a/Source/WebCore/bindings/v8/custom/V8IDBAnyCustom.cpp b/Source/WebCore/bindings/v8/custom/V8IDBAnyCustom.cpp index ccd6fb2..a1a8636 100644 --- a/Source/WebCore/bindings/v8/custom/V8IDBAnyCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8IDBAnyCustom.cpp @@ -77,6 +77,6 @@ v8::Handle<v8::Value> toV8(IDBAny* impl)      return v8::Undefined();  } -#endif // ENABLE(INDEXED_DATABASE) -  } // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/Source/WebCore/bindings/v8/custom/V8IDBKeyCustom.cpp b/Source/WebCore/bindings/v8/custom/V8IDBKeyCustom.cpp index 3805dca..b8fa6bb 100644 --- a/Source/WebCore/bindings/v8/custom/V8IDBKeyCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8IDBKeyCustom.cpp @@ -56,6 +56,6 @@ v8::Handle<v8::Value> toV8(IDBKey* key)      return v8::Undefined();  } -#endif // ENABLE(INDEXED_DATABASE) -  } // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) diff --git a/Source/WebCore/bindings/v8/custom/V8InjectedScriptHostCustom.cpp b/Source/WebCore/bindings/v8/custom/V8InjectedScriptHostCustom.cpp index 7a33ed0..3dbacb2 100644 --- a/Source/WebCore/bindings/v8/custom/V8InjectedScriptHostCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8InjectedScriptHostCustom.cpp @@ -1,5 +1,5 @@  /* - * Copyright (C) 2007-2009 Google Inc. All rights reserved. + * Copyright (C) 2007-2011 Google Inc. All rights reserved.   *   * Redistribution and use in source and binary forms, with or without   * modification, are permitted provided that the following conditions are @@ -31,27 +31,21 @@  #include "config.h"  #include "V8InjectedScriptHost.h" -#include "DOMWindow.h"  #include "Database.h" -#include "Frame.h"  #include "InjectedScript.h"  #include "InjectedScriptHost.h" +#include "InspectorDebuggerAgent.h"  #include "InspectorValues.h" -#include "Node.h" -#include "Page.h"  #include "ScriptDebugServer.h"  #include "ScriptValue.h" -  #include "V8Binding.h"  #include "V8BindingState.h" -#include "V8DOMWindow.h"  #include "V8Database.h"  #include "V8HiddenPropertyName.h"  #include "V8JavaScriptCallFrame.h"  #include "V8Node.h"  #include "V8Proxy.h"  #include "V8Storage.h" -#include <wtf/RefPtr.h>  namespace WebCore { @@ -71,86 +65,6 @@ ScriptValue InjectedScriptHost::nodeAsScriptValue(ScriptState* state, Node* node      return ScriptValue(toV8(node));  } -static void WeakReferenceCallback(v8::Persistent<v8::Value> object, void* parameter) -{ -    InjectedScriptHost* nativeObject = static_cast<InjectedScriptHost*>(parameter); -    nativeObject->deref(); -    object.Dispose(); -} - -static v8::Local<v8::Object> createInjectedScriptHostV8Wrapper(InjectedScriptHost* host) -{ -    v8::Local<v8::Function> function = V8InjectedScriptHost::GetTemplate()->GetFunction(); -    if (function.IsEmpty()) { -        // Return if allocation failed. -        return v8::Local<v8::Object>(); -    } -    v8::Local<v8::Object> instance = SafeAllocation::newInstance(function); -    if (instance.IsEmpty()) { -        // Avoid setting the wrapper if allocation failed. -        return v8::Local<v8::Object>(); -    } -    V8DOMWrapper::setDOMWrapper(instance, &V8InjectedScriptHost::info, host); -    // Create a weak reference to the v8 wrapper of InspectorBackend to deref -    // InspectorBackend when the wrapper is garbage collected. -    host->ref(); -    v8::Persistent<v8::Object> weakHandle = v8::Persistent<v8::Object>::New(instance); -    weakHandle.MakeWeak(host, &WeakReferenceCallback); -    return instance; -} - -ScriptObject InjectedScriptHost::createInjectedScript(const String& scriptSource, ScriptState* inspectedScriptState, long id) -{ -    v8::HandleScope scope; - -    v8::Local<v8::Context> inspectedContext = inspectedScriptState->context(); -    v8::Context::Scope contextScope(inspectedContext); - -    // Call custom code to create InjectedScripHost wrapper specific for the context -    // instead of calling toV8() that would create the -    // wrapper in the current context. -    // FIXME: make it possible to use generic bindings factory for InjectedScriptHost. -    v8::Local<v8::Object> scriptHostWrapper = createInjectedScriptHostV8Wrapper(this); -    if (scriptHostWrapper.IsEmpty()) -        return ScriptObject(); - -    v8::Local<v8::Object> windowGlobal = inspectedContext->Global(); - -    // Inject javascript into the context. The compiled script is supposed to evaluate into -    // a single anonymous function(it's anonymous to avoid cluttering the global object with -    // inspector's stuff) the function is called a few lines below with InjectedScriptHost wrapper, -    // injected script id and explicit reference to the inspected global object. The function is expected -    // to create and configure InjectedScript instance that is going to be used by the inspector. -    v8::Local<v8::Script> script = v8::Script::Compile(v8String(scriptSource)); -    v8::Local<v8::Value> v = script->Run(); -    ASSERT(!v.IsEmpty()); -    ASSERT(v->IsFunction()); - -    v8::Handle<v8::Value> args[] = { -      scriptHostWrapper, -      windowGlobal, -      v8::Number::New(id), -    }; -    v8::Local<v8::Value> injectedScriptValue = v8::Function::Cast(*v)->Call(windowGlobal, 3, args); -    v8::Local<v8::Object> injectedScript(v8::Object::Cast(*injectedScriptValue)); -    return ScriptObject(inspectedScriptState, injectedScript); -} - -void InjectedScriptHost::discardInjectedScript(ScriptState* inspectedScriptState) -{ -    v8::HandleScope handleScope; -    v8::Local<v8::Context> context = inspectedScriptState->context(); -    v8::Context::Scope contextScope(context); - -    v8::Local<v8::Object> global = context->Global(); -    // Skip proxy object. The proxy object will survive page navigation while we need -    // an object whose lifetime consides with that of the inspected context. -    global = v8::Local<v8::Object>::Cast(global->GetPrototype()); - -    v8::Handle<v8::String> key = V8HiddenPropertyName::devtoolsInjectedScript(); -    global->DeleteHiddenValue(key); -} -  v8::Handle<v8::Value> V8InjectedScriptHost::inspectedNodeCallback(const v8::Arguments& args)  {      INC_STATS("InjectedScriptHost.inspectedNode()"); @@ -185,9 +99,9 @@ v8::Handle<v8::Value> V8InjectedScriptHost::inspectCallback(const v8::Arguments&          return v8::Undefined();      InjectedScriptHost* host = V8InjectedScriptHost::toNative(args.Holder()); -    ScriptValue objectId(args[0]); +    ScriptValue object(args[0]);      ScriptValue hints(args[1]); -    host->inspectImpl(objectId.toInspectorValue(ScriptState::current()), hints.toInspectorValue(ScriptState::current())); +    host->inspectImpl(object.toInspectorValue(ScriptState::current()), hints.toInspectorValue(ScriptState::current()));      return v8::Undefined();  } @@ -196,7 +110,8 @@ v8::Handle<v8::Value> V8InjectedScriptHost::currentCallFrameCallback(const v8::A  {  #if ENABLE(JAVASCRIPT_DEBUGGER)      INC_STATS("InjectedScriptHost.currentCallFrame()"); -    return toV8(ScriptDebugServer::shared().currentCallFrame()); +    InjectedScriptHost* host = V8InjectedScriptHost::toNative(args.Holder()); +    return toV8(host->debuggerAgent()->scriptDebugServer().currentCallFrame());  #else      UNUSED_PARAM(args);      return v8::Undefined(); @@ -231,46 +146,4 @@ v8::Handle<v8::Value> V8InjectedScriptHost::storageIdCallback(const v8::Argument      return v8::Undefined();  } -InjectedScript InjectedScriptHost::injectedScriptFor(ScriptState* inspectedScriptState) -{ -    v8::HandleScope handleScope; -    v8::Local<v8::Context> context = inspectedScriptState->context(); -    v8::Context::Scope contextScope(context); - -    v8::Local<v8::Object> global = context->Global(); -    // Skip proxy object. The proxy object will survive page navigation while we need -    // an object whose lifetime consides with that of the inspected context. -    global = v8::Local<v8::Object>::Cast(global->GetPrototype()); - -    v8::Handle<v8::String> key = V8HiddenPropertyName::devtoolsInjectedScript(); -    v8::Local<v8::Value> val = global->GetHiddenValue(key); -    if (!val.IsEmpty() && val->IsObject()) -        return InjectedScript(ScriptObject(inspectedScriptState, v8::Local<v8::Object>::Cast(val))); - -    if (!canAccessInspectedWindow(inspectedScriptState)) -        return InjectedScript(); - -    pair<long, ScriptObject> injectedScript = injectScript(injectedScriptSource(), inspectedScriptState); -    InjectedScript result(injectedScript.second); -    m_idToInjectedScript.set(injectedScript.first, result); -    global->SetHiddenValue(key, injectedScript.second.v8Object()); -    return result; -} - -bool InjectedScriptHost::canAccessInspectedWindow(ScriptState* scriptState) -{ -    v8::HandleScope handleScope; -    v8::Local<v8::Context> context = scriptState->context(); -    v8::Local<v8::Object> global = context->Global(); -    if (global.IsEmpty()) -        return false; -    v8::Handle<v8::Object> holder = V8DOMWrapper::lookupDOMWrapper(V8DOMWindow::GetTemplate(), global); -    if (holder.IsEmpty()) -        return false; -    Frame* frame = V8DOMWindow::toNative(holder)->frame(); - -    v8::Context::Scope contextScope(context); -    return V8BindingSecurity::canAccessFrame(V8BindingState::Only(), frame, false); -} -  } // namespace WebCore diff --git a/Source/WebCore/bindings/v8/custom/V8InjectedScriptManager.cpp b/Source/WebCore/bindings/v8/custom/V8InjectedScriptManager.cpp new file mode 100644 index 0000000..f4006b8 --- /dev/null +++ b/Source/WebCore/bindings/v8/custom/V8InjectedScriptManager.cpp @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2007-2011 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + *     * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + *     * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + *     * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "InjectedScriptManager.h" + +#include "DOMWindow.h" +#include "InjectedScript.h" +#include "InjectedScriptHost.h" +#include "ScriptValue.h" +#include "V8Binding.h" +#include "V8BindingState.h" +#include "V8DOMWindow.h" +#include "V8HiddenPropertyName.h" +#include "V8InjectedScriptHost.h" +#include "V8Proxy.h" +#include <wtf/RefPtr.h> + +namespace WebCore { + +static void WeakReferenceCallback(v8::Persistent<v8::Value> object, void* parameter) +{ +    InjectedScriptHost* nativeObject = static_cast<InjectedScriptHost*>(parameter); +    nativeObject->deref(); +    object.Dispose(); +} + +static v8::Local<v8::Object> createInjectedScriptHostV8Wrapper(InjectedScriptHost* host) +{ +    v8::Local<v8::Function> function = V8InjectedScriptHost::GetTemplate()->GetFunction(); +    if (function.IsEmpty()) { +        // Return if allocation failed. +        return v8::Local<v8::Object>(); +    } +    v8::Local<v8::Object> instance = SafeAllocation::newInstance(function); +    if (instance.IsEmpty()) { +        // Avoid setting the wrapper if allocation failed. +        return v8::Local<v8::Object>(); +    } +    V8DOMWrapper::setDOMWrapper(instance, &V8InjectedScriptHost::info, host); +    // Create a weak reference to the v8 wrapper of InspectorBackend to deref +    // InspectorBackend when the wrapper is garbage collected. +    host->ref(); +    v8::Persistent<v8::Object> weakHandle = v8::Persistent<v8::Object>::New(instance); +    weakHandle.MakeWeak(host, &WeakReferenceCallback); +    return instance; +} + +ScriptObject InjectedScriptManager::createInjectedScript(const String& scriptSource, ScriptState* inspectedScriptState, long id) +{ +    v8::HandleScope scope; + +    v8::Local<v8::Context> inspectedContext = inspectedScriptState->context(); +    v8::Context::Scope contextScope(inspectedContext); + +    // Call custom code to create InjectedScripHost wrapper specific for the context +    // instead of calling toV8() that would create the +    // wrapper in the current context. +    // FIXME: make it possible to use generic bindings factory for InjectedScriptHost. +    v8::Local<v8::Object> scriptHostWrapper = createInjectedScriptHostV8Wrapper(m_injectedScriptHost.get()); +    if (scriptHostWrapper.IsEmpty()) +        return ScriptObject(); + +    v8::Local<v8::Object> windowGlobal = inspectedContext->Global(); + +    // Inject javascript into the context. The compiled script is supposed to evaluate into +    // a single anonymous function(it's anonymous to avoid cluttering the global object with +    // inspector's stuff) the function is called a few lines below with InjectedScriptHost wrapper, +    // injected script id and explicit reference to the inspected global object. The function is expected +    // to create and configure InjectedScript instance that is going to be used by the inspector. +    v8::Local<v8::Script> script = v8::Script::Compile(v8String(scriptSource)); +    v8::Local<v8::Value> v = script->Run(); +    ASSERT(!v.IsEmpty()); +    ASSERT(v->IsFunction()); + +    v8::Handle<v8::Value> args[] = { +      scriptHostWrapper, +      windowGlobal, +      v8::Number::New(id), +    }; +    v8::Local<v8::Value> injectedScriptValue = v8::Function::Cast(*v)->Call(windowGlobal, 3, args); +    v8::Local<v8::Object> injectedScript(v8::Object::Cast(*injectedScriptValue)); +    return ScriptObject(inspectedScriptState, injectedScript); +} + +void InjectedScriptManager::discardInjectedScript(ScriptState* inspectedScriptState) +{ +    v8::HandleScope handleScope; +    v8::Local<v8::Context> context = inspectedScriptState->context(); +    v8::Context::Scope contextScope(context); + +    v8::Local<v8::Object> global = context->Global(); +    // Skip proxy object. The proxy object will survive page navigation while we need +    // an object whose lifetime consides with that of the inspected context. +    global = v8::Local<v8::Object>::Cast(global->GetPrototype()); + +    v8::Handle<v8::String> key = V8HiddenPropertyName::devtoolsInjectedScript(); +    global->DeleteHiddenValue(key); +} + +InjectedScript InjectedScriptManager::injectedScriptFor(ScriptState* inspectedScriptState) +{ +    v8::HandleScope handleScope; +    v8::Local<v8::Context> context = inspectedScriptState->context(); +    v8::Context::Scope contextScope(context); + +    v8::Local<v8::Object> global = context->Global(); +    // Skip proxy object. The proxy object will survive page navigation while we need +    // an object whose lifetime consides with that of the inspected context. +    global = v8::Local<v8::Object>::Cast(global->GetPrototype()); + +    v8::Handle<v8::String> key = V8HiddenPropertyName::devtoolsInjectedScript(); +    v8::Local<v8::Value> val = global->GetHiddenValue(key); +    if (!val.IsEmpty() && val->IsObject()) +        return InjectedScript(ScriptObject(inspectedScriptState, v8::Local<v8::Object>::Cast(val))); + +    if (!canAccessInspectedWindow(inspectedScriptState)) +        return InjectedScript(); + +    pair<long, ScriptObject> injectedScript = injectScript(injectedScriptSource(), inspectedScriptState); +    InjectedScript result(injectedScript.second); +    m_idToInjectedScript.set(injectedScript.first, result); +    global->SetHiddenValue(key, injectedScript.second.v8Object()); +    return result; +} + +bool InjectedScriptManager::canAccessInspectedWindow(ScriptState* scriptState) +{ +    v8::HandleScope handleScope; +    v8::Local<v8::Context> context = scriptState->context(); +    v8::Local<v8::Object> global = context->Global(); +    if (global.IsEmpty()) +        return false; +    v8::Handle<v8::Object> holder = V8DOMWrapper::lookupDOMWrapper(V8DOMWindow::GetTemplate(), global); +    if (holder.IsEmpty()) +        return false; +    Frame* frame = V8DOMWindow::toNative(holder)->frame(); + +    v8::Context::Scope contextScope(context); +    return V8BindingSecurity::canAccessFrame(V8BindingState::Only(), frame, false); +} + +} // namespace WebCore diff --git a/Source/WebCore/bindings/v8/custom/V8WebKitAnimationCustom.cpp b/Source/WebCore/bindings/v8/custom/V8WebKitAnimationCustom.cpp new file mode 100644 index 0000000..c0949ae --- /dev/null +++ b/Source/WebCore/bindings/v8/custom/V8WebKitAnimationCustom.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2011 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + *  * Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + *  * Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "V8WebKitAnimation.h" + +#include "V8Binding.h" +#include "V8BindingMacros.h" +#include "V8Proxy.h" +#include "WebKitAnimation.h" + +#include <v8.h> + +namespace WebCore { + +v8::Handle<v8::Value> V8WebKitAnimation::iterationCountAccessorGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) +{ +    INC_STATS("DOM.WebKitAnimation.iterationCount._get"); +    v8::Handle<v8::Object> holder = info.Holder(); +    WebKitAnimation* imp = V8WebKitAnimation::toNative(holder); +    int count = imp->iterationCount(); +    if (count == Animation::IterationCountInfinite) +        return v8::Number::New(std::numeric_limits<float>::infinity()); +    return v8::Number::New(count); +} + +} // namespace WebCore + | 
