summaryrefslogtreecommitdiffstats
path: root/JavaScriptCore/qt/api/qscriptoriginalglobalobject_p.h
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-05-06 11:45:16 +0100
committerSteve Block <steveblock@google.com>2011-05-12 13:44:10 +0100
commitcad810f21b803229eb11403f9209855525a25d57 (patch)
tree29a6fd0279be608e0fe9ffe9841f722f0f4e4269 /JavaScriptCore/qt/api/qscriptoriginalglobalobject_p.h
parent121b0cf4517156d0ac5111caf9830c51b69bae8f (diff)
downloadexternal_webkit-cad810f21b803229eb11403f9209855525a25d57.zip
external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.gz
external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.bz2
Merge WebKit at r75315: Initial merge by git.
Change-Id: I570314b346ce101c935ed22a626b48c2af266b84
Diffstat (limited to 'JavaScriptCore/qt/api/qscriptoriginalglobalobject_p.h')
-rw-r--r--JavaScriptCore/qt/api/qscriptoriginalglobalobject_p.h209
1 files changed, 0 insertions, 209 deletions
diff --git a/JavaScriptCore/qt/api/qscriptoriginalglobalobject_p.h b/JavaScriptCore/qt/api/qscriptoriginalglobalobject_p.h
deleted file mode 100644
index 2bd945f..0000000
--- a/JavaScriptCore/qt/api/qscriptoriginalglobalobject_p.h
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#ifndef qscriptoriginalglobalobject_p_h
-#define qscriptoriginalglobalobject_p_h
-
-#include <JavaScriptCore/JavaScript.h>
-#include <JavaScriptCore/JSRetainPtr.h>
-#include <QtCore/qvector.h>
-
-/*!
- \internal
- This class is a workaround for missing JSC C API functionality. This class keeps all important
- properties of an original (default) global object, so we can use it even if the global object was
- changed.
-
- FIXME this class is a container for workarounds :-) it should be replaced by proper JSC C API calls.
-
- The class have to be created on the QScriptEnginePrivate creation time (before any change got applied to
- global object).
-*/
-class QScriptOriginalGlobalObject {
-public:
- inline QScriptOriginalGlobalObject(JSGlobalContextRef context);
- inline ~QScriptOriginalGlobalObject();
-
- inline bool objectHasOwnProperty(JSObjectRef object, JSStringRef property) const;
- inline QVector<JSStringRef> objectGetOwnPropertyNames(JSObjectRef object) const;
-
- inline bool isDate(JSValueRef value) const;
- inline bool isArray(JSValueRef value) const;
- inline bool isError(JSValueRef value) const;
-
- inline JSValueRef functionPrototype() const;
-private:
- inline bool isType(JSValueRef value, JSObjectRef constructor, JSValueRef prototype) const;
- inline void initializeMember(JSObjectRef globalObject, JSStringRef prototypeName, const char* type, JSObjectRef& constructor, JSValueRef& prototype);
-
- // Copy of the global context reference (the same as in QScriptEnginePrivate).
- JSGlobalContextRef m_context;
-
- // Copy of constructors and prototypes used in isType functions.
- JSObjectRef m_arrayConstructor;
- JSValueRef m_arrayPrototype;
- JSObjectRef m_errorConstructor;
- JSValueRef m_errorPrototype;
- JSObjectRef m_functionConstructor;
- JSValueRef m_functionPrototype;
- JSObjectRef m_dateConstructor;
- JSValueRef m_datePrototype;
-
- // Reference to standard JS functions that are not exposed by JSC C API.
- JSObjectRef m_hasOwnPropertyFunction;
- JSObjectRef m_getOwnPropertyNamesFunction;
-};
-
-QScriptOriginalGlobalObject::QScriptOriginalGlobalObject(JSGlobalContextRef context)
- : m_context(JSGlobalContextRetain(context))
-{
- JSObjectRef globalObject = JSContextGetGlobalObject(m_context);
- JSValueRef exception = 0;
- JSRetainPtr<JSStringRef> propertyName;
-
- propertyName.adopt(JSStringCreateWithUTF8CString("prototype"));
- initializeMember(globalObject, propertyName.get(), "Array", m_arrayConstructor, m_arrayPrototype);
- initializeMember(globalObject, propertyName.get(), "Error", m_errorConstructor, m_errorPrototype);
- initializeMember(globalObject, propertyName.get(), "Function", m_functionConstructor, m_functionPrototype);
- initializeMember(globalObject, propertyName.get(), "Date", m_dateConstructor, m_datePrototype);
-
- propertyName.adopt(JSStringCreateWithUTF8CString("hasOwnProperty"));
- m_hasOwnPropertyFunction = const_cast<JSObjectRef>(JSObjectGetProperty(m_context, globalObject, propertyName.get(), &exception));
- JSValueProtect(m_context, m_hasOwnPropertyFunction);
- Q_ASSERT(JSValueIsObject(m_context, m_hasOwnPropertyFunction));
- Q_ASSERT(JSObjectIsFunction(m_context, m_hasOwnPropertyFunction));
- Q_ASSERT(!exception);
-
- propertyName.adopt(JSStringCreateWithUTF8CString("Object"));
- JSObjectRef objectConstructor
- = const_cast<JSObjectRef>(JSObjectGetProperty(m_context, globalObject, propertyName.get(), &exception));
- propertyName.adopt(JSStringCreateWithUTF8CString("getOwnPropertyNames"));
- m_getOwnPropertyNamesFunction
- = const_cast<JSObjectRef>(JSObjectGetProperty(m_context, objectConstructor, propertyName.get(), &exception));
- JSValueProtect(m_context, m_getOwnPropertyNamesFunction);
- Q_ASSERT(JSValueIsObject(m_context, m_getOwnPropertyNamesFunction));
- Q_ASSERT(JSObjectIsFunction(m_context, m_getOwnPropertyNamesFunction));
- Q_ASSERT(!exception);
-}
-
-inline void QScriptOriginalGlobalObject::initializeMember(JSObjectRef globalObject, JSStringRef prototypeName, const char* type, JSObjectRef& constructor, JSValueRef& prototype)
-{
- JSRetainPtr<JSStringRef> typeName(Adopt, JSStringCreateWithUTF8CString(type));
- JSValueRef exception = 0;
-
- // Save references to the Type constructor and prototype.
- JSValueRef typeConstructor = JSObjectGetProperty(m_context, globalObject, typeName.get(), &exception);
- Q_ASSERT(JSValueIsObject(m_context, typeConstructor));
- constructor = JSValueToObject(m_context, typeConstructor, &exception);
- JSValueProtect(m_context, constructor);
-
- // Note that this is not the [[Prototype]] internal property (which we could
- // get via JSObjectGetPrototype), but the Type.prototype, that will be set
- // as [[Prototype]] of Type instances.
- prototype = JSObjectGetProperty(m_context, constructor, prototypeName, &exception);
- Q_ASSERT(JSValueIsObject(m_context, prototype));
- JSValueProtect(m_context, prototype);
- Q_ASSERT(!exception);
-}
-
-QScriptOriginalGlobalObject::~QScriptOriginalGlobalObject()
-{
- JSValueUnprotect(m_context, m_arrayConstructor);
- JSValueUnprotect(m_context, m_arrayPrototype);
- JSValueUnprotect(m_context, m_errorConstructor);
- JSValueUnprotect(m_context, m_errorPrototype);
- JSValueUnprotect(m_context, m_functionConstructor);
- JSValueUnprotect(m_context, m_functionPrototype);
- JSValueUnprotect(m_context, m_dateConstructor);
- JSValueUnprotect(m_context, m_datePrototype);
- JSValueUnprotect(m_context, m_hasOwnPropertyFunction);
- JSValueUnprotect(m_context, m_getOwnPropertyNamesFunction);
- JSGlobalContextRelease(m_context);
-}
-
-inline bool QScriptOriginalGlobalObject::objectHasOwnProperty(JSObjectRef object, JSStringRef property) const
-{
- // FIXME This function should be replaced by JSC C API.
- JSValueRef exception = 0;
- JSValueRef propertyName[] = { JSValueMakeString(m_context, property) };
- JSValueRef result = JSObjectCallAsFunction(m_context, m_hasOwnPropertyFunction, object, 1, propertyName, &exception);
- return exception ? false : JSValueToBoolean(m_context, result);
-}
-
-/*!
- \internal
- This method gives ownership of all JSStringRefs.
-*/
-inline QVector<JSStringRef> QScriptOriginalGlobalObject::objectGetOwnPropertyNames(JSObjectRef object) const
-{
- JSValueRef exception = 0;
- JSObjectRef propertyNames
- = const_cast<JSObjectRef>(JSObjectCallAsFunction(m_context,
- m_getOwnPropertyNamesFunction,
- /* thisObject */ 0,
- /* argumentCount */ 1,
- &object,
- &exception));
- Q_ASSERT(JSValueIsObject(m_context, propertyNames));
- Q_ASSERT(!exception);
- JSStringRef lengthName = QScriptConverter::toString("length");
- int count = JSValueToNumber(m_context, JSObjectGetProperty(m_context, propertyNames, lengthName, &exception), &exception);
-
- Q_ASSERT(!exception);
- QVector<JSStringRef> names;
- names.reserve(count);
- for (int i = 0; i < count; ++i) {
- JSValueRef tmp = JSObjectGetPropertyAtIndex(m_context, propertyNames, i, &exception);
- names.append(JSValueToStringCopy(m_context, tmp, &exception));
- Q_ASSERT(!exception);
- }
- return names;
-}
-
-inline bool QScriptOriginalGlobalObject::isDate(JSValueRef value) const
-{
- return isType(value, m_dateConstructor, m_datePrototype);
-}
-
-inline bool QScriptOriginalGlobalObject::isArray(JSValueRef value) const
-{
- return isType(value, m_arrayConstructor, m_arrayPrototype);
-}
-
-inline bool QScriptOriginalGlobalObject::isError(JSValueRef value) const
-{
- return isType(value, m_errorConstructor, m_errorPrototype);
-}
-
-inline JSValueRef QScriptOriginalGlobalObject::functionPrototype() const
-{
- return m_functionPrototype;
-}
-
-inline bool QScriptOriginalGlobalObject::isType(JSValueRef value, JSObjectRef constructor, JSValueRef prototype) const
-{
- // JSC API doesn't export the [[Class]] information for the builtins. But we know that a value
- // is an object of the Type if it was created with the Type constructor or if it is the Type.prototype.
- JSValueRef exception = 0;
- bool result = JSValueIsInstanceOfConstructor(m_context, value, constructor, &exception) || JSValueIsStrictEqual(m_context, value, prototype);
- Q_ASSERT(!exception);
- return result;
-}
-
-#endif // qscriptoriginalglobalobject_p_h