diff options
author | Ben Murdoch <benm@google.com> | 2011-06-02 12:07:03 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2011-06-10 10:47:21 +0100 |
commit | 2daae5fd11344eaa88a0d92b0f6d65f8d2255c00 (patch) | |
tree | e4964fbd1cb70599f7718ff03e50ea1dab33890b /Source/WebCore/bindings/v8/custom | |
parent | 87bdf0060a247bfbe668342b87e0874182e0ffa9 (diff) | |
download | external_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.zip external_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.tar.gz external_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.tar.bz2 |
Merge WebKit at r84325: Initial merge by git.
Change-Id: Ic1a909300ecc0a13ddc6b4e784371d2ac6e3d59b
Diffstat (limited to 'Source/WebCore/bindings/v8/custom')
10 files changed, 135 insertions, 102 deletions
diff --git a/Source/WebCore/bindings/v8/custom/V8AudioContextCustom.cpp b/Source/WebCore/bindings/v8/custom/V8AudioContextCustom.cpp index 419cd60..f2f8dc0 100644 --- a/Source/WebCore/bindings/v8/custom/V8AudioContextCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8AudioContextCustom.cpp @@ -51,7 +51,34 @@ v8::Handle<v8::Value> V8AudioContext::constructorCallback(const v8::Arguments& a if (!document) return throwError("AudioContext constructor associated document is unavailable", V8Proxy::ReferenceError); - RefPtr<AudioContext> audioContext = AudioContext::create(document); + RefPtr<AudioContext> audioContext; + + if (!args.Length()) { + // Constructor for default AudioContext which talks to audio hardware. + audioContext = AudioContext::create(document); + } else { + // Constructor for offline (render-target) AudioContext which renders into an AudioBuffer. + // new AudioContext(in unsigned long numberOfChannels, in unsigned long numberOfFrames, in float sampleRate); + if (args.Length() < 3) + return throwError("Not enough arguments", V8Proxy::SyntaxError); + + bool ok = false; + + unsigned numberOfChannels = toInt32(args[0], ok); + if (!ok) + return throwError("Invalid number of channels", V8Proxy::SyntaxError); + + unsigned numberOfFrames = toInt32(args[1], ok); + if (!ok) + return throwError("Invalid number of frames", V8Proxy::SyntaxError); + + float sampleRate = toFloat(args[2]); + + audioContext = AudioContext::createOfflineContext(document, numberOfChannels, numberOfFrames, sampleRate); + } + + if (!audioContext.get()) + return throwError("Error creating AudioContext", V8Proxy::SyntaxError); // Transform the holder into a wrapper object for the audio context. V8DOMWrapper::setDOMWrapper(args.Holder(), &info, audioContext.get()); diff --git a/Source/WebCore/bindings/v8/custom/V8CSSStyleDeclarationCustom.cpp b/Source/WebCore/bindings/v8/custom/V8CSSStyleDeclarationCustom.cpp index 850ae14..097924b 100644 --- a/Source/WebCore/bindings/v8/custom/V8CSSStyleDeclarationCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8CSSStyleDeclarationCustom.cpp @@ -40,6 +40,8 @@ #include "V8Binding.h" #include "V8Proxy.h" +#include <wtf/text/StringBuilder.h> +#include <wtf/text/StringConcatenate.h> #include <wtf/ASCIICType.h> #include <wtf/PassRefPtr.h> #include <wtf/RefPtr.h> @@ -107,8 +109,8 @@ static CSSPropertyInfo* cssPropertyInfo(v8::Handle<v8::String>v8PropertyName) if (!length) return 0; - Vector<UChar> name; - name.reserveCapacity(length); + StringBuilder builder; + builder.reserveCapacity(length); unsigned i = 0; @@ -123,23 +125,21 @@ static CSSPropertyInfo* cssPropertyInfo(v8::Handle<v8::String>v8PropertyName) } else if (hasCSSPropertyNamePrefix(propertyName, "webkit") || hasCSSPropertyNamePrefix(propertyName, "khtml") || hasCSSPropertyNamePrefix(propertyName, "apple")) - name.append('-'); + builder.append('-'); else if (WTF::isASCIIUpper(propertyName[0])) return 0; - name.append(WTF::toASCIILower(propertyName[i++])); + builder.append(WTF::toASCIILower(propertyName[i++])); for (; i < length; ++i) { UChar c = propertyName[i]; if (!WTF::isASCIIUpper(c)) - name.append(c); - else { - name.append('-'); - name.append(WTF::toASCIILower(c)); - } + builder.append(c); + else + builder.append(makeString('-', toASCIILower(c))); } - String propName = String::adopt(name); + String propName = builder.toString(); int propertyID = cssPropertyID(propName); if (propertyID) { propInfo = new CSSPropertyInfo(); diff --git a/Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp b/Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp index 85ae322..43d5a15 100644 --- a/Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp @@ -32,6 +32,7 @@ #include "V8DOMWindow.h" #include "Chrome.h" +#include "ContentSecurityPolicy.h" #include "DOMTimer.h" #include "DOMWindow.h" #include "ExceptionCode.h" @@ -131,6 +132,8 @@ v8::Handle<v8::Value> WindowSetTimeoutImpl(const v8::Arguments& args, bool singl id = DOMTimer::install(scriptContext, action, timeout, singleShot); } else { + if (imp->document() && !imp->document()->contentSecurityPolicy()->allowEval()) + return v8::Integer::New(0); id = DOMTimer::install(scriptContext, new ScheduledAction(V8Proxy::context(imp->frame()), functionString), timeout, singleShot); } diff --git a/Source/WebCore/bindings/v8/custom/V8DirectoryEntryCustom.cpp b/Source/WebCore/bindings/v8/custom/V8DirectoryEntryCustom.cpp index a44131a..0889451 100644 --- a/Source/WebCore/bindings/v8/custom/V8DirectoryEntryCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8DirectoryEntryCustom.cpp @@ -39,7 +39,7 @@ #include "V8BindingMacros.h" #include "V8EntryCallback.h" #include "V8ErrorCallback.h" -#include "V8Flags.h" +#include "V8WebKitFlags.h" #include "V8Proxy.h" #include <wtf/RefCounted.h> #include <wtf/RefPtr.h> @@ -55,10 +55,10 @@ v8::Handle<v8::Value> V8DirectoryEntry::getDirectoryCallback(const v8::Arguments imp->getDirectory(path); return v8::Handle<v8::Value>(); } - RefPtr<Flags> flags; - if (!isUndefinedOrNull(args[1]) && args[1]->IsObject() && !V8Flags::HasInstance(args[1])) { + RefPtr<WebKitFlags> flags; + if (!isUndefinedOrNull(args[1]) && args[1]->IsObject() && !V8WebKitFlags::HasInstance(args[1])) { EXCEPTION_BLOCK(v8::Handle<v8::Object>, object, v8::Handle<v8::Object>::Cast(args[1])); - flags = Flags::create(); + flags = WebKitFlags::create(); v8::Local<v8::Value> v8Create = object->Get(v8::String::New("create")); if (!v8Create.IsEmpty() && !isUndefinedOrNull(v8Create)) { EXCEPTION_BLOCK(bool, isCreate, v8Create->BooleanValue()); @@ -70,7 +70,7 @@ v8::Handle<v8::Value> V8DirectoryEntry::getDirectoryCallback(const v8::Arguments flags->setExclusive(isExclusive); } } else { - EXCEPTION_BLOCK(Flags*, tmp_flags, V8Flags::HasInstance(args[1]) ? V8Flags::toNative(v8::Handle<v8::Object>::Cast(args[1])) : 0); + EXCEPTION_BLOCK(WebKitFlags*, tmp_flags, V8WebKitFlags::HasInstance(args[1]) ? V8WebKitFlags::toNative(v8::Handle<v8::Object>::Cast(args[1])) : 0); flags = tmp_flags; } RefPtr<EntryCallback> successCallback; @@ -98,10 +98,10 @@ v8::Handle<v8::Value> V8DirectoryEntry::getFileCallback(const v8::Arguments& arg imp->getFile(path); return v8::Handle<v8::Value>(); } - RefPtr<Flags> flags; - if (!isUndefinedOrNull(args[1]) && args[1]->IsObject() && !V8Flags::HasInstance(args[1])) { + RefPtr<WebKitFlags> flags; + if (!isUndefinedOrNull(args[1]) && args[1]->IsObject() && !V8WebKitFlags::HasInstance(args[1])) { EXCEPTION_BLOCK(v8::Handle<v8::Object>, object, v8::Handle<v8::Object>::Cast(args[1])); - flags = Flags::create(); + flags = WebKitFlags::create(); v8::Local<v8::Value> v8Create = object->Get(v8::String::New("create")); if (!v8Create.IsEmpty() && !isUndefinedOrNull(v8Create)) { EXCEPTION_BLOCK(bool, isCreate, v8Create->BooleanValue()); @@ -113,7 +113,7 @@ v8::Handle<v8::Value> V8DirectoryEntry::getFileCallback(const v8::Arguments& arg flags->setExclusive(isExclusive); } } else { - EXCEPTION_BLOCK(Flags*, tmp_flags, V8Flags::HasInstance(args[1]) ? V8Flags::toNative(v8::Handle<v8::Object>::Cast(args[1])) : 0); + EXCEPTION_BLOCK(WebKitFlags*, tmp_flags, V8WebKitFlags::HasInstance(args[1]) ? V8WebKitFlags::toNative(v8::Handle<v8::Object>::Cast(args[1])) : 0); flags = tmp_flags; } RefPtr<EntryCallback> successCallback; diff --git a/Source/WebCore/bindings/v8/custom/V8DirectoryEntrySyncCustom.cpp b/Source/WebCore/bindings/v8/custom/V8DirectoryEntrySyncCustom.cpp index 90b3d13..cd38ca4 100644 --- a/Source/WebCore/bindings/v8/custom/V8DirectoryEntrySyncCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8DirectoryEntrySyncCustom.cpp @@ -40,7 +40,7 @@ #include "V8EntryCallback.h" #include "V8ErrorCallback.h" #include "V8FileEntrySync.h" -#include "V8Flags.h" +#include "V8WebKitFlags.h" #include "V8Proxy.h" #include <wtf/RefCounted.h> #include <wtf/RefPtr.h> @@ -62,13 +62,13 @@ static bool extractBooleanValue(const v8::Handle<v8::Object>& object, const char return false; } -static PassRefPtr<Flags> getFlags(const v8::Local<v8::Value>& arg, ExceptionCode& ec) +static PassRefPtr<WebKitFlags> getFlags(const v8::Local<v8::Value>& arg, ExceptionCode& ec) { ec = 0; if (isUndefinedOrNull(arg) || !arg->IsObject()) return 0; - if (V8Flags::HasInstance(arg)) - return V8Flags::toNative(v8::Handle<v8::Object>::Cast(arg)); + if (V8WebKitFlags::HasInstance(arg)) + return V8WebKitFlags::toNative(v8::Handle<v8::Object>::Cast(arg)); v8::Handle<v8::Object> object; { @@ -87,7 +87,7 @@ static PassRefPtr<Flags> getFlags(const v8::Local<v8::Value>& arg, ExceptionCode if (ec) return 0; - RefPtr<Flags> flags = Flags::create(); + RefPtr<WebKitFlags> flags = WebKitFlags::create(); flags->setCreate(isCreate); flags->setExclusive(isExclusive); @@ -100,7 +100,7 @@ v8::Handle<v8::Value> V8DirectoryEntrySync::getDirectoryCallback(const v8::Argum DirectoryEntrySync* imp = V8DirectoryEntrySync::toNative(args.Holder()); ExceptionCode ec = 0; STRING_TO_V8PARAMETER_EXCEPTION_BLOCK(V8Parameter<>, path, args[0]); - RefPtr<Flags> flags = getFlags(args[1], ec); + RefPtr<WebKitFlags> flags = getFlags(args[1], ec); if (UNLIKELY(ec)) { V8Proxy::setDOMException(ec); return v8::Handle<v8::Value>(); @@ -119,7 +119,7 @@ v8::Handle<v8::Value> V8DirectoryEntrySync::getFileCallback(const v8::Arguments& DirectoryEntrySync* imp = V8DirectoryEntrySync::toNative(args.Holder()); ExceptionCode ec = 0; STRING_TO_V8PARAMETER_EXCEPTION_BLOCK(V8Parameter<>, path, args[0]); - RefPtr<Flags> flags = getFlags(args[1], ec); + RefPtr<WebKitFlags> flags = getFlags(args[1], ec); if (UNLIKELY(ec)) { V8Proxy::setDOMException(ec); return v8::Handle<v8::Value>(); diff --git a/Source/WebCore/bindings/v8/custom/V8DocumentCustom.cpp b/Source/WebCore/bindings/v8/custom/V8DocumentCustom.cpp index c435863..7cad58e 100644 --- a/Source/WebCore/bindings/v8/custom/V8DocumentCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8DocumentCustom.cpp @@ -118,34 +118,6 @@ v8::Handle<v8::Value> V8Document::getCSSCanvasContextCallback(const v8::Argument return v8::Undefined(); } - -// DOMImplementation is a singleton in WebCore. If we use our normal -// mapping from DOM objects to V8 wrappers, the same wrapper will be -// shared for all frames in the same process. This is a major -// security problem. Therefore, we generate a DOMImplementation -// wrapper per document and store it in an internal field of the -// document. Since the DOMImplementation object is a singleton, we do -// not have to do anything to keep the DOMImplementation object alive -// for the lifetime of the wrapper. -v8::Handle<v8::Value> V8Document::implementationAccessorGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) -{ - ASSERT(info.Holder()->InternalFieldCount() >= internalFieldCount); - - // Check if the internal field already contains a wrapper. - v8::Local<v8::Value> implementation = info.Holder()->GetInternalField(V8Document::implementationIndex); - if (!implementation->IsUndefined()) - return implementation; - - // Generate a wrapper. - Document* document = V8Document::toNative(info.Holder()); - v8::Handle<v8::Value> wrapper = toV8(document->implementation()); - - // Store the wrapper in the internal field. - info.Holder()->SetInternalField(implementationIndex, wrapper); - - return wrapper; -} - v8::Handle<v8::Value> toV8(Document* impl, bool forceNewObject) { if (!impl) diff --git a/Source/WebCore/bindings/v8/custom/V8EventCustom.cpp b/Source/WebCore/bindings/v8/custom/V8EventCustom.cpp index abb7d4c..7e12034 100644 --- a/Source/WebCore/bindings/v8/custom/V8EventCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8EventCustom.cpp @@ -70,6 +70,7 @@ #if ENABLE(WEB_AUDIO) #include "V8AudioProcessingEvent.h" +#include "V8OfflineAudioCompletionEvent.h" #endif namespace WebCore { @@ -169,6 +170,8 @@ v8::Handle<v8::Value> toV8(Event* impl) #if ENABLE(WEB_AUDIO) if (impl->isAudioProcessingEvent()) return toV8(static_cast<AudioProcessingEvent*>(impl)); + if (impl->isOfflineAudioCompletionEvent()) + return toV8(static_cast<OfflineAudioCompletionEvent*>(impl)); #endif #if ENABLE(INPUT_SPEECH) if (impl->isSpeechInputEvent()) diff --git a/Source/WebCore/bindings/v8/custom/V8GeolocationCustom.cpp b/Source/WebCore/bindings/v8/custom/V8GeolocationCustom.cpp index 54bd11c..91389d8 100644 --- a/Source/WebCore/bindings/v8/custom/V8GeolocationCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8GeolocationCustom.cpp @@ -33,52 +33,13 @@ #include "V8Binding.h" #include "V8CustomPositionCallback.h" #include "V8CustomPositionErrorCallback.h" -#include "V8Proxy.h" +#include "V8Utilities.h" using namespace std; using namespace WTF; namespace WebCore { -static const char typeMismatchError[] = "TYPE_MISMATCH_ERR: DOM Exception 17"; - -static void throwTypeMismatchException() -{ - V8Proxy::throwError(V8Proxy::GeneralError, typeMismatchError); -} - -static PassRefPtr<PositionCallback> createPositionCallback(v8::Local<v8::Value> value, bool& succeeded) -{ - succeeded = true; - - // The spec specifies 'FunctionOnly' for this object. - if (!value->IsFunction()) { - succeeded = false; - throwTypeMismatchException(); - return 0; - } - - return V8CustomPositionCallback::create(value, getScriptExecutionContext()); -} - -static PassRefPtr<PositionErrorCallback> createPositionErrorCallback(v8::Local<v8::Value> value, bool& succeeded) -{ - succeeded = true; - - // Argument is optional (hence undefined is allowed), and null is allowed. - if (isUndefinedOrNull(value)) - return 0; - - // The spec specifies 'FunctionOnly' for this object. - if (!value->IsFunction()) { - succeeded = false; - throwTypeMismatchException(); - return 0; - } - - return V8CustomPositionErrorCallback::create(value, getScriptExecutionContext()); -} - static PassRefPtr<PositionOptions> createPositionOptions(v8::Local<v8::Value> value, bool& succeeded) { succeeded = true; @@ -172,12 +133,13 @@ v8::Handle<v8::Value> V8Geolocation::getCurrentPositionCallback(const v8::Argume bool succeeded = false; - RefPtr<PositionCallback> positionCallback = createPositionCallback(args[0], succeeded); + RefPtr<PositionCallback> positionCallback = createFunctionOnlyCallback<V8CustomPositionCallback>(args[0], succeeded); if (!succeeded) return v8::Undefined(); ASSERT(positionCallback); - RefPtr<PositionErrorCallback> positionErrorCallback = createPositionErrorCallback(args[1], succeeded); + // Argument is optional (hence undefined is allowed), and null is allowed. + RefPtr<PositionErrorCallback> positionErrorCallback = createFunctionOnlyCallback<V8CustomPositionErrorCallback>(args[1], succeeded, CallbackAllowUndefined | CallbackAllowNull); if (!succeeded) return v8::Undefined(); @@ -197,12 +159,13 @@ v8::Handle<v8::Value> V8Geolocation::watchPositionCallback(const v8::Arguments& bool succeeded = false; - RefPtr<PositionCallback> positionCallback = createPositionCallback(args[0], succeeded); + RefPtr<PositionCallback> positionCallback = createFunctionOnlyCallback<V8CustomPositionCallback>(args[0], succeeded); if (!succeeded) return v8::Undefined(); ASSERT(positionCallback); - RefPtr<PositionErrorCallback> positionErrorCallback = createPositionErrorCallback(args[1], succeeded); + // Argument is optional (hence undefined is allowed), and null is allowed. + RefPtr<PositionErrorCallback> positionErrorCallback = createFunctionOnlyCallback<V8CustomPositionErrorCallback>(args[1], succeeded, CallbackAllowUndefined | CallbackAllowNull); if (!succeeded) return v8::Undefined(); diff --git a/Source/WebCore/bindings/v8/custom/V8InjectedScriptManager.cpp b/Source/WebCore/bindings/v8/custom/V8InjectedScriptManager.cpp index f4006b8..8bb4281 100644 --- a/Source/WebCore/bindings/v8/custom/V8InjectedScriptManager.cpp +++ b/Source/WebCore/bindings/v8/custom/V8InjectedScriptManager.cpp @@ -139,13 +139,13 @@ InjectedScript InjectedScriptManager::injectedScriptFor(ScriptState* inspectedSc 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))); + return InjectedScript(ScriptObject(inspectedScriptState, v8::Local<v8::Object>::Cast(val)), m_inspectedStateAccessCheck); - if (!canAccessInspectedWindow(inspectedScriptState)) + if (!m_inspectedStateAccessCheck(inspectedScriptState)) return InjectedScript(); pair<long, ScriptObject> injectedScript = injectScript(injectedScriptSource(), inspectedScriptState); - InjectedScript result(injectedScript.second); + InjectedScript result(injectedScript.second, m_inspectedStateAccessCheck); m_idToInjectedScript.set(injectedScript.first, result); global->SetHiddenValue(key, injectedScript.second.v8Object()); return result; diff --git a/Source/WebCore/bindings/v8/custom/V8NavigatorCustom.cpp b/Source/WebCore/bindings/v8/custom/V8NavigatorCustom.cpp index e5a6909..16e8cfe 100644 --- a/Source/WebCore/bindings/v8/custom/V8NavigatorCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8NavigatorCustom.cpp @@ -1,4 +1,5 @@ /* +<<<<<<< HEAD * Copyright (C) 2010 Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,11 +27,35 @@ * 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. +======= + * Copyright (C) 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: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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 APPLE INC. AND ITS 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 APPLE INC. OR ITS 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. +>>>>>>> WebKit.org at r84325 */ #include "config.h" #include "V8Navigator.h" +<<<<<<< HEAD #if PLATFORM(ANDROID) && ENABLE(APPLICATION_INSTALLED) #include "ExceptionCode.h" @@ -77,9 +102,49 @@ v8::Handle<v8::Value> V8Navigator::isApplicationInstalledCallback(const v8::Argu if (!navigator->isApplicationInstalled(toWebCoreString(args[0]), callback.release())) return throwError(INVALID_STATE_ERR); +======= +#if ENABLE(MEDIA_STREAM) + +#include "Navigator.h" +#include "V8Binding.h" +#include "V8NavigatorUserMediaErrorCallback.h" +#include "V8NavigatorUserMediaSuccessCallback.h" +#include "V8Utilities.h" + +using namespace WTF; + +namespace WebCore { + +v8::Handle<v8::Value> V8Navigator::webkitGetUserMediaCallback(const v8::Arguments& args) +{ + INC_STATS("DOM.Navigator.webkitGetUserMedia()"); + + v8::TryCatch exceptionCatcher; + String options = toWebCoreString(args[0]); + if (exceptionCatcher.HasCaught()) + return throwError(exceptionCatcher.Exception()); + + bool succeeded = false; + + RefPtr<NavigatorUserMediaSuccessCallback> successCallback = createFunctionOnlyCallback<V8NavigatorUserMediaSuccessCallback>(args[1], succeeded); + if (!succeeded) + return v8::Undefined(); + + // Argument is optional, hence undefined is allowed. + RefPtr<NavigatorUserMediaErrorCallback> errorCallback = createFunctionOnlyCallback<V8NavigatorUserMediaErrorCallback>(args[2], succeeded, CallbackAllowUndefined); + if (!succeeded) + return v8::Undefined(); + + Navigator* navigator = V8Navigator::toNative(args.Holder()); + navigator->webkitGetUserMedia(options, successCallback.release(), errorCallback.release()); +>>>>>>> WebKit.org at r84325 return v8::Undefined(); } } // namespace WebCore +<<<<<<< HEAD #endif // PLATFORM(ANDROID) && ENABLE(APPLICATION_INSTALLED) +======= +#endif // ENABLE(MEDIA_STREAM) +>>>>>>> WebKit.org at r84325 |