| Index: Source/WebCore/bindings/dart/DartUtilities.cpp
|
| diff --git a/Source/WebCore/bindings/dart/DartUtilities.cpp b/Source/WebCore/bindings/dart/DartUtilities.cpp
|
| deleted file mode 100644
|
| index f8f13329a9d6cc074554210895a07fcf7e33d5eb..0000000000000000000000000000000000000000
|
| --- a/Source/WebCore/bindings/dart/DartUtilities.cpp
|
| +++ /dev/null
|
| @@ -1,474 +0,0 @@
|
| -// Copyright 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 "DartUtilities.h"
|
| -
|
| -#include "DartEventListener.h"
|
| -#include "DartIsolateState.h"
|
| -#include "DartMessagePort.h"
|
| -#include "DartNode.h"
|
| -#include "DOMWindow.h"
|
| -#include "Document.h"
|
| -#include "Frame.h"
|
| -#include "ScriptCallStack.h"
|
| -#include "ScriptArguments.h"
|
| -#include "SerializedScriptValue.h"
|
| -#include "V8Converter.h"
|
| -#include "V8Proxy.h"
|
| -
|
| -#include <wtf/text/AtomicString.h>
|
| -#include <wtf/text/CString.h>
|
| -
|
| -namespace WebCore {
|
| -
|
| -const char* DartUtilities::domLibraryName = "dart:dom";
|
| -
|
| -PassRefPtr<StringImpl> DartUtilities::toStringImpl(Dart_Handle object, ConversionFlag flag, Dart_Handle& exception)
|
| -{
|
| - if (flag == ConvertNullToEmptyString && Dart_IsNull(object))
|
| - return 0;
|
| -
|
| - if (!Dart_IsString(object)) {
|
| - exception = Dart_NewString("String expected");
|
| - return 0;
|
| - }
|
| - if (!Dart_IsString16(object)) {
|
| - // FIXME: consider convertion to UTF16 in this case.
|
| - exception = Dart_NewString("32-bit string met, cannot be used in DOM API");
|
| - return 0;
|
| - }
|
| -
|
| - if (Dart_IsExternalString(object)) {
|
| - void* peer = 0;
|
| - Dart_ExternalStringGetPeer(object, &peer);
|
| - ASSERT(peer);
|
| - StringImpl* stringImpl = reinterpret_cast<StringImpl*>(peer);
|
| - return stringImpl;
|
| - }
|
| -
|
| - // Note: hopefully we should never overflow length as the string would be just too long to fit
|
| - // into memory.
|
| - intptr_t length = 0;
|
| - Dart_StringLength(object, &length);
|
| - UChar* buffer;
|
| - RefPtr<StringImpl> result = StringImpl::createUninitialized(length, buffer);
|
| - Dart_StringGet16(object, buffer, &length);
|
| - return result.release();
|
| -}
|
| -
|
| -static void stringFinalizer(void* peer) {
|
| - StringImpl* stringImpl = reinterpret_cast<StringImpl*>(peer);
|
| - stringImpl->deref();
|
| -}
|
| -
|
| -static Dart_Handle stringImplToDartString(StringImpl* stringImpl)
|
| -{
|
| - if (!stringImpl)
|
| - return Dart_NewString8(0, 0);
|
| -
|
| - stringImpl->ref();
|
| - // FIXME: maybe it makes sense only externalize strings longer than certain threshold, such as 5 symbols.
|
| - return Dart_NewExternalString16(stringImpl->characters(), stringImpl->length(),
|
| - stringImpl, stringFinalizer);
|
| -}
|
| -
|
| -Dart_Handle DartUtilities::stringToDartString(const String& str)
|
| -{
|
| - return stringImplToDartString(str.impl());
|
| -}
|
| -
|
| -Dart_Handle DartUtilities::stringToDartString(const AtomicString& str)
|
| -{
|
| - return stringImplToDartString(str.impl());
|
| -}
|
| -
|
| -template <typename Trait>
|
| -typename Trait::nativeType convert(Dart_Handle object, Dart_Handle& exception)
|
| -{
|
| - typename Trait::nativeType value;
|
| - return !Dart_IsError(Trait::convert(object, &value)) ? value : typename Trait::nativeType();
|
| -}
|
| -
|
| -struct IntegerTrait {
|
| - typedef int64_t nativeType;
|
| - static Dart_Handle convert(Dart_Handle object, int64_t* value)
|
| - {
|
| - return Dart_IntegerToInt64(object, value);
|
| - // FIXME: support bigints.
|
| - }
|
| -};
|
| -
|
| -int64_t DartUtilities::toInteger(Dart_Handle object, Dart_Handle& exception)
|
| -{
|
| - return convert<IntegerTrait>(object, exception);
|
| -}
|
| -
|
| -int64_t DartUtilities::toInteger(Dart_Handle object)
|
| -{
|
| - Dart_Handle exception = 0;
|
| - int64_t value = DartUtilities::toInteger(object, exception);
|
| - ASSERT(!exception);
|
| - return value;
|
| -}
|
| -
|
| -struct DoubleTrait {
|
| - typedef double nativeType;
|
| - static Dart_Handle convert(Dart_Handle object, double* value)
|
| - {
|
| - if (!Dart_IsNumber(object))
|
| - return Dart_Error("the object !is Number");
|
| -
|
| - object = Dart_InvokeDynamic(object, Dart_NewString("toDouble"), 0, 0);
|
| - if (Dart_IsError(object))
|
| - return object;
|
| -
|
| - return Dart_DoubleValue(object, value);
|
| - }
|
| -};
|
| -
|
| -double DartUtilities::toDouble(Dart_Handle object, Dart_Handle& exception)
|
| -{
|
| - return convert<DoubleTrait>(object, exception);
|
| -}
|
| -
|
| -double DartUtilities::toDouble(Dart_Handle object)
|
| -{
|
| - Dart_Handle exception = 0;
|
| - double value = DartUtilities::toDouble(object, exception);
|
| - ASSERT(!exception);
|
| - return value;
|
| -}
|
| -
|
| -struct BoolTrait {
|
| - typedef bool nativeType;
|
| - static Dart_Handle convert(Dart_Handle object, bool* value) { return Dart_BooleanValue(object, value); }
|
| -};
|
| -
|
| -bool DartUtilities::toBool(Dart_Handle object, Dart_Handle& exception)
|
| -{
|
| - return convert<BoolTrait>(object, exception);
|
| -}
|
| -
|
| -bool DartUtilities::toBool(Dart_Handle object)
|
| -{
|
| - Dart_Handle exception = 0;
|
| - bool value = DartUtilities::toBool(object, exception);
|
| - ASSERT(!exception);
|
| - return value;
|
| -}
|
| -
|
| -PassRefPtr<EventListener> DartUtilities::toEventListener(Dart_Handle object, Dart_Handle& exception)
|
| -{
|
| - if (Dart_IsNull(object)) {
|
| - exception = Dart_NewString("Null passed where Dart closure is expected");
|
| - return 0;
|
| - }
|
| -
|
| - if (!Dart_IsClosure(object)) {
|
| - exception = Dart_NewString("Not a Dart closure passed");
|
| - return 0;
|
| - }
|
| -
|
| - return DartEventListener::createOrFetch(object);
|
| -}
|
| -
|
| -static v8::Local<v8::Context> currentV8Context()
|
| -{
|
| - Frame* frame = DartUtilities::domWindowForCurrentIsolate()->frame();
|
| - v8::Local<v8::Context> context = V8Proxy::mainWorldContext(frame);
|
| - ASSERT(!context.IsEmpty());
|
| - return context;
|
| -}
|
| -
|
| -PassRefPtr<SerializedScriptValue> DartUtilities::toSerializedScriptValue(Dart_Handle value, Dart_Handle& exception)
|
| -{
|
| - v8::HandleScope handleScope;
|
| - v8::Context::Scope scope(currentV8Context());
|
| -
|
| - v8::Handle<v8::Value> v8Value = V8Converter::toV8(value, exception);
|
| - if (exception)
|
| - return 0;
|
| - return SerializedScriptValue::create(v8Value);
|
| -}
|
| -
|
| -Dart_Handle DartUtilities::fromSerializedScriptValue(SerializedScriptValue* value)
|
| -{
|
| - v8::HandleScope handleScope;
|
| - v8::Context::Scope scope(currentV8Context());
|
| -
|
| - // FIXME: better error handling.
|
| - Dart_Handle exception = 0;
|
| - return V8Converter::toDart(value->deserialize(), exception);
|
| -}
|
| -
|
| -PassRefPtr<EventTarget> DartUtilities::toEventTarget(Dart_Handle object, Dart_Handle& exception)
|
| -{
|
| - // FIXME: currently it's too risky to remove, but when Optional=CallWithDefaultValue is
|
| - // implemented, we should give it a try and unify with the rest of conversion.
|
| - if (Dart_IsNull(object))
|
| - return 0;
|
| -
|
| - return DartNode::toNative(object, exception);
|
| -}
|
| -
|
| -// FIXME: this function requires better testing. Currently blocking as new MessageChannel hasn't been implemented yet.
|
| -void DartUtilities::toMessagePortArray(Dart_Handle value, MessagePortArray& portArray, Dart_Handle& exception)
|
| -{
|
| - Dart_Handle dom = Dart_LookupLibrary(Dart_NewString(DartUtilities::domLibraryName));
|
| - ASSERT(!Dart_IsError(dom));
|
| -
|
| - Dart_Handle asList = Dart_InvokeStatic(dom, Dart_NewString("Utils"), Dart_NewString("convertToList"), 1, &value);
|
| - if (Dart_IsError(asList)) {
|
| - DartUtilities::reportProblem(DartUtilities::scriptExecutionContext(), asList);
|
| - exception = DartDOMWrapper::exceptionCodeToDartException(INVALID_STATE_ERR);
|
| - return;
|
| - }
|
| - ASSERT(Dart_IsList(asList));
|
| -
|
| - intptr_t length = 0;
|
| - Dart_ListLength(asList, &length);
|
| - portArray.resize(length);
|
| - for (int i = 0; i < length; i++) {
|
| - Dart_Handle element = Dart_ListGetAt(asList, i);
|
| - if (Dart_IsError(element)) {
|
| - exception = DartDOMWrapper::exceptionCodeToDartException(INVALID_STATE_ERR);
|
| - return;
|
| - }
|
| -
|
| - MessagePort* messagePort = DartMessagePort::toNative(element, exception).get();
|
| - if (exception) {
|
| - exception = DartDOMWrapper::exceptionCodeToDartException(INVALID_STATE_ERR);
|
| - return;
|
| - }
|
| -
|
| - ASSERT(messagePort);
|
| - portArray[i] = messagePort;
|
| - }
|
| -}
|
| -
|
| -class DartDOMData {
|
| -public:
|
| - DartDOMData()
|
| - : m_scriptExecutionContext(0)
|
| - , m_domWindow(0)
|
| - , m_recursion(0)
|
| - {
|
| - }
|
| -
|
| - DartDOMData(ScriptExecutionContext* context)
|
| - : m_scriptExecutionContext(context)
|
| - , m_recursion(0)
|
| - {
|
| - ASSERT(context);
|
| - ASSERT(context->isDocument()); // WorkerContext is not supported yet.
|
| - Document* document = static_cast<Document*>(context);
|
| - m_domWindow = document->domWindow();
|
| - }
|
| -
|
| - ScriptExecutionContext* scriptExecutionContext() { return m_scriptExecutionContext; }
|
| - DOMWindow* domWindow() { return m_domWindow; }
|
| - DartDOMMap* domMap() { return &m_domMap; }
|
| - int* recursion() { return &m_recursion; }
|
| -
|
| -private:
|
| - ScriptExecutionContext* m_scriptExecutionContext;
|
| - DOMWindow* m_domWindow;
|
| - DartDOMMap m_domMap;
|
| - int m_recursion;
|
| -};
|
| -
|
| -typedef HashMap<Dart_Isolate, DartDOMData*> IsolateToDartDOMDataMap;
|
| -
|
| -static IsolateToDartDOMDataMap& isolateToDartDOMDataMap()
|
| -{
|
| - DEFINE_STATIC_LOCAL(IsolateToDartDOMDataMap, map, ());
|
| - return map;
|
| -}
|
| -
|
| -static DartDOMData* domDataForIsolate(Dart_Isolate isolate)
|
| -{
|
| - IsolateToDartDOMDataMap::iterator it = isolateToDartDOMDataMap().find(isolate);
|
| - ASSERT(it != isolateToDartDOMDataMap().end());
|
| - return it->second;
|
| -}
|
| -
|
| -static DartDOMData* currentDOMData()
|
| -{
|
| - return domDataForIsolate(DartIsolateState::current());
|
| -}
|
| -
|
| -void DartUtilities::registerIsolateContext(Dart_Isolate isolate, ScriptExecutionContext* context)
|
| -{
|
| - ASSERT(!isolateToDartDOMDataMap().contains(isolate));
|
| - isolateToDartDOMDataMap().set(isolate, new DartDOMData(context));
|
| -}
|
| -
|
| -ScriptExecutionContext* DartUtilities::isolateContext(Dart_Isolate isolate)
|
| -{
|
| - return domDataForIsolate(isolate)->scriptExecutionContext();
|
| -}
|
| -
|
| -void DartUtilities::unregisterIsolateContext(Dart_Isolate isolate)
|
| -{
|
| - IsolateToDartDOMDataMap::iterator it = isolateToDartDOMDataMap().find(isolate);
|
| - ASSERT(it != isolateToDartDOMDataMap().end());
|
| - delete it->second;
|
| - isolateToDartDOMDataMap().remove(it);
|
| -}
|
| -
|
| -bool DartUtilities::isFullDomIsolate(Dart_Isolate isolate)
|
| -{
|
| - return isolateToDartDOMDataMap().contains(isolate);
|
| -}
|
| -
|
| -DOMWindow* DartUtilities::domWindowForIsolate(Dart_Isolate isolate)
|
| -{
|
| - return domDataForIsolate(isolate)->domWindow();
|
| -}
|
| -
|
| -DOMWindow* DartUtilities::domWindowForCurrentIsolate()
|
| -{
|
| - return currentDOMData()->domWindow();
|
| -}
|
| -
|
| -Dart_Handle DartUtilities::domLibraryForCurrentIsolate()
|
| -{
|
| - // FIXME: Cache this on the isolate.
|
| - Dart_Handle library = Dart_LookupLibrary(Dart_NewString(domLibraryName));
|
| - ASSERT(!Dart_IsError(library));
|
| - return library;
|
| -}
|
| -
|
| -DartDOMMap* DartUtilities::domMapForIsolate(Dart_Isolate isolate)
|
| -{
|
| - return domDataForIsolate(isolate)->domMap();
|
| -}
|
| -
|
| -DartDOMMap* DartUtilities::domMapForCurrentIsolate()
|
| -{
|
| - return currentDOMData()->domMap();
|
| -}
|
| -
|
| -int* DartUtilities::recursionForIsolate(Dart_Isolate isolate)
|
| -{
|
| - return domDataForIsolate(isolate)->recursion();
|
| -}
|
| -
|
| -int* DartUtilities::recursionForCurrentIsolate()
|
| -{
|
| - return currentDOMData()->recursion();
|
| -}
|
| -
|
| -ScriptExecutionContext* DartUtilities::scriptExecutionContext()
|
| -{
|
| - return currentDOMData()->scriptExecutionContext();
|
| -}
|
| -
|
| -bool DartUtilities::processingUserGesture()
|
| -{
|
| - // FIXME: implement this.
|
| - return false;
|
| -}
|
| -
|
| -PassRefPtr<ScriptArguments> DartUtilities::createScriptArguments(Dart_Handle argument, Dart_Handle& exception)
|
| -{
|
| - v8::Handle<v8::Value> v8Argument = V8Converter::toV8(argument, exception);
|
| - if (v8Argument->IsUndefined())
|
| - return 0;
|
| - Vector<ScriptValue> arguments;
|
| - arguments.append(v8Argument);
|
| - ScriptState* scriptState = ScriptState::forContext(currentV8Context());
|
| - return ScriptArguments::create(scriptState, arguments);
|
| -}
|
| -
|
| -PassRefPtr<ScriptCallStack> DartUtilities::createScriptCallStack()
|
| -{
|
| - // FIXME: wrap current dart call stack as ScriptCallStack.
|
| - Vector<ScriptCallFrame> wrappedCallFrames;
|
| - wrappedCallFrames.append(ScriptCallFrame("undefined", "undefined", 0));
|
| - return ScriptCallStack::create(wrappedCallFrames);
|
| -}
|
| -
|
| -const uint8_t* DartUtilities::fullSnapshot()
|
| -{
|
| - static const uint8_t snapshotBuffer[] = {
|
| -// DartSnapshot.bytes is generated by build system.
|
| -#include "DartSnapshot.bytes"
|
| - };
|
| - return snapshotBuffer;
|
| -}
|
| -
|
| -void DartUtilities::reportProblem(ScriptExecutionContext* context, Dart_Handle result)
|
| -{
|
| - ASSERT(Dart_IsError(result));
|
| -
|
| - const String internalErrorPrefix("Internal error: ");
|
| -
|
| - String errorMessage;
|
| - // FIXME: source file info.
|
| - String sourceFile = "FIXME";
|
| - // FIXME: line number info.
|
| - int lineNumber = 0;
|
| - // FIXME: call stack info.
|
| - RefPtr<ScriptCallStack> callStack;
|
| -
|
| - if (!Dart_ErrorHasException(result))
|
| - errorMessage = internalErrorPrefix + Dart_GetError(result);
|
| - else {
|
| - // Print the exception.
|
| - Dart_Handle exception = Dart_ErrorGetException(result);
|
| - ASSERT(!Dart_IsError(exception));
|
| -
|
| - exception = Dart_ToString(exception);
|
| - if (Dart_IsError(exception))
|
| - errorMessage = String("Error converting exception to a string: ") + Dart_GetError(exception);
|
| - else
|
| - errorMessage = String("Exception: ") + DartUtilities::dartStringToString(exception);
|
| -
|
| - // FIXME: Fill in the callStack, sourceFile, and lineNumber
|
| - // and remove the below once the Dart APIs to iterate over the
|
| - // trace are available.
|
| -
|
| - // Print the stack trace.
|
| - Dart_Handle stacktrace = Dart_ErrorGetStacktrace(result);
|
| - ASSERT(!Dart_IsError(stacktrace));
|
| -
|
| - stacktrace = Dart_ToString(stacktrace);
|
| - if (Dart_IsError(stacktrace))
|
| - errorMessage += String("\nError converting stack trace to a string: ") + Dart_GetError(stacktrace);
|
| - else
|
| - errorMessage += String("\nStack Trace: ") + DartUtilities::dartStringToString(stacktrace);
|
| - }
|
| -
|
| - if (context && context->isDocument())
|
| - static_cast<Document*>(context)->reportException(errorMessage, lineNumber, sourceFile, callStack);
|
| -}
|
| -
|
| -}
|
|
|