diff options
author | Steve Block <steveblock@google.com> | 2011-05-18 13:36:51 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2011-05-24 15:38:28 +0100 |
commit | 2fc2651226baac27029e38c9d6ef883fa32084db (patch) | |
tree | e396d4bf89dcce6ed02071be66212495b1df1dec /Source/WebCore/bridge | |
parent | b3725cedeb43722b3b175aaeff70552e562d2c94 (diff) | |
download | external_webkit-2fc2651226baac27029e38c9d6ef883fa32084db.zip external_webkit-2fc2651226baac27029e38c9d6ef883fa32084db.tar.gz external_webkit-2fc2651226baac27029e38c9d6ef883fa32084db.tar.bz2 |
Merge WebKit at r78450: Initial merge by git.
Change-Id: I6d3e5f1f868ec266a0aafdef66182ddc3f265dc1
Diffstat (limited to 'Source/WebCore/bridge')
-rw-r--r-- | Source/WebCore/bridge/jsc/BridgeJSC.cpp | 1 | ||||
-rw-r--r-- | Source/WebCore/bridge/qt/qt_class.cpp | 2 | ||||
-rw-r--r-- | Source/WebCore/bridge/qt/qt_instance.cpp | 18 | ||||
-rw-r--r-- | Source/WebCore/bridge/qt/qt_instance.h | 4 | ||||
-rw-r--r-- | Source/WebCore/bridge/qt/qt_runtime.cpp | 26 | ||||
-rw-r--r-- | Source/WebCore/bridge/qt/qt_runtime.h | 4 | ||||
-rw-r--r-- | Source/WebCore/bridge/runtime_root.cpp | 32 | ||||
-rw-r--r-- | Source/WebCore/bridge/runtime_root.h | 4 |
8 files changed, 47 insertions, 44 deletions
diff --git a/Source/WebCore/bridge/jsc/BridgeJSC.cpp b/Source/WebCore/bridge/jsc/BridgeJSC.cpp index 49ffb2a..2747c75 100644 --- a/Source/WebCore/bridge/jsc/BridgeJSC.cpp +++ b/Source/WebCore/bridge/jsc/BridgeJSC.cpp @@ -106,7 +106,6 @@ RuntimeObject* Instance::newRuntimeObject(ExecState* exec) void Instance::willDestroyRuntimeObject(RuntimeObject* object) { ASSERT(m_rootObject); - ASSERT(m_rootObject->isValid()); m_rootObject->removeRuntimeObject(object); m_runtimeObject.clear(object); } diff --git a/Source/WebCore/bridge/qt/qt_class.cpp b/Source/WebCore/bridge/qt/qt_class.cpp index 4c29c69..3c1836a 100644 --- a/Source/WebCore/bridge/qt/qt_class.cpp +++ b/Source/WebCore/bridge/qt/qt_class.cpp @@ -74,7 +74,7 @@ JSValue QtClass::fallbackObject(ExecState* exec, Instance* inst, const Identifie const QByteArray name = QString(reinterpret_cast<const QChar*>(ustring.characters()), ustring.length()).toAscii(); // First see if we have a cache hit - JSObject* val = qtinst->m_methods.value(name); + JSObject* val = qtinst->m_methods.value(name).get(); if (val) return val; diff --git a/Source/WebCore/bridge/qt/qt_instance.cpp b/Source/WebCore/bridge/qt/qt_instance.cpp index 78263e9..b4d2117 100644 --- a/Source/WebCore/bridge/qt/qt_instance.cpp +++ b/Source/WebCore/bridge/qt/qt_instance.cpp @@ -34,6 +34,7 @@ #include <qhash.h> #include <qmetaobject.h> #include <qmetatype.h> +#include <qwebelement.h> namespace JSC { namespace Bindings { @@ -82,9 +83,10 @@ QtInstance::QtInstance(QObject* o, PassRefPtr<RootObject> rootObject, QScriptEng , m_class(0) , m_object(o) , m_hashkey(o) - , m_defaultMethod(0) , m_ownership(ownership) { + // This is a good place to register Qt metatypes that are in the QtWebKit module, as this is class will initialize if we have a QObject bridge. + qRegisterMetaType<QWebElement>(); } QtInstance::~QtInstance() @@ -148,12 +150,12 @@ void QtInstance::put(JSObject* object, ExecState* exec, const Identifier& proper void QtInstance::removeCachedMethod(JSObject* method) { - if (m_defaultMethod == method) - m_defaultMethod = 0; + if (m_defaultMethod.get() == method) + m_defaultMethod.clear(); - for (QHash<QByteArray, JSObject*>::Iterator it = m_methods.begin(), + for (QHash<QByteArray, DeprecatedPtr<JSObject> >::Iterator it = m_methods.begin(), end = m_methods.end(); it != end; ++it) - if (it.value() == method) { + if (it.value().get() == method) { m_methods.erase(it); return; } @@ -188,10 +190,10 @@ RuntimeObject* QtInstance::newRuntimeObject(ExecState* exec) void QtInstance::markAggregate(MarkStack& markStack) { if (m_defaultMethod) - markStack.append(m_defaultMethod); - foreach (JSObject* val, m_methods.values()) { + markStack.append(&m_defaultMethod); + foreach (DeprecatedPtr<JSObject> val, m_methods.values()) { if (val) - markStack.append(val); + markStack.append(&val); } } diff --git a/Source/WebCore/bridge/qt/qt_instance.h b/Source/WebCore/bridge/qt/qt_instance.h index 25aea53..003c801 100644 --- a/Source/WebCore/bridge/qt/qt_instance.h +++ b/Source/WebCore/bridge/qt/qt_instance.h @@ -83,9 +83,9 @@ private: mutable QtClass* m_class; QPointer<QObject> m_object; QObject* m_hashkey; - mutable QHash<QByteArray, JSObject*> m_methods; + mutable QHash<QByteArray, DeprecatedPtr<JSObject> > m_methods; mutable QHash<QString, QtField*> m_fields; - mutable QtRuntimeMetaMethod* m_defaultMethod; + mutable WriteBarrier<QtRuntimeMetaMethod> m_defaultMethod; QScriptEngine::ValueOwnership m_ownership; }; diff --git a/Source/WebCore/bridge/qt/qt_runtime.cpp b/Source/WebCore/bridge/qt/qt_runtime.cpp index 0fb811b..5507fc9 100644 --- a/Source/WebCore/bridge/qt/qt_runtime.cpp +++ b/Source/WebCore/bridge/qt/qt_runtime.cpp @@ -587,7 +587,7 @@ QVariant convertValueToQVariant(ExecState* exec, JSValue value, QMetaType::Type if (qstring.mid(lastSlash + 1).contains(QLatin1Char('i'))) realRe.setCaseSensitivity(Qt::CaseInsensitive); - ret = qVariantFromValue(realRe); + ret = QVariant::fromValue(realRe); dist = 0; } else { qConvDebug() << "couldn't parse a JS regexp"; @@ -598,7 +598,7 @@ QVariant convertValueToQVariant(ExecState* exec, JSValue value, QMetaType::Type QRegExp re(qstring); if (re.isValid()) { - ret = qVariantFromValue(re); + ret = QVariant::fromValue(re); dist = 10; } } @@ -610,7 +610,7 @@ QVariant convertValueToQVariant(ExecState* exec, JSValue value, QMetaType::Type if (qtinst) { if (qtinst->getObject()) { qConvDebug() << "found instance, with object:" << (void*) qtinst->getObject(); - ret = qVariantFromValue(qtinst->getObject()); + ret = QVariant::fromValue(qtinst->getObject()); qConvDebug() << ret; dist = 0; } else { @@ -621,7 +621,7 @@ QVariant convertValueToQVariant(ExecState* exec, JSValue value, QMetaType::Type } } else if (type == Null) { QObject* nullobj = 0; - ret = qVariantFromValue(nullobj); + ret = QVariant::fromValue(nullobj); dist = 0; } else { qConvDebug() << "previous type was not an object:" << type; @@ -634,7 +634,7 @@ QVariant convertValueToQVariant(ExecState* exec, JSValue value, QMetaType::Type if (qtinst) { if (qtinst->getObject()) { qConvDebug() << "found instance, with object:" << (void*) qtinst->getObject(); - ret = qVariantFromValue((void *)qtinst->getObject()); + ret = QVariant::fromValue((void *)qtinst->getObject()); qConvDebug() << ret; dist = 0; } else { @@ -644,7 +644,7 @@ QVariant convertValueToQVariant(ExecState* exec, JSValue value, QMetaType::Type qConvDebug() << "wasn't a qtinstance"; } } else if (type == Null) { - ret = qVariantFromValue((void*)0); + ret = QVariant::fromValue((void*)0); dist = 0; } else if (type == Number) { // I don't think that converting a double to a pointer is a wise @@ -1401,8 +1401,6 @@ QtRuntimeMetaMethod::QtRuntimeMetaMethod(ExecState* exec, const Identifier& iden QW_D(QtRuntimeMetaMethod); d->m_signature = signature; d->m_index = index; - d->m_connect = 0; - d->m_disconnect = 0; d->m_allowPrivate = allowPrivate; } @@ -1411,9 +1409,9 @@ void QtRuntimeMetaMethod::markChildren(MarkStack& markStack) QtRuntimeMethod::markChildren(markStack); QW_D(QtRuntimeMetaMethod); if (d->m_connect) - markStack.append(d->m_connect); + markStack.append(&d->m_connect); if (d->m_disconnect) - markStack.append(d->m_disconnect); + markStack.append(&d->m_disconnect); } EncodedJSValue QtRuntimeMetaMethod::call(ExecState* exec) @@ -1523,8 +1521,8 @@ JSValue QtRuntimeMetaMethod::connectGetter(ExecState* exec, JSValue slotBase, co QW_DS(QtRuntimeMetaMethod, thisObj); if (!d->m_connect) - d->m_connect = new (exec) QtRuntimeConnectionMethod(exec, ident, true, d->m_instance, d->m_index, d->m_signature); - return d->m_connect; + d->m_connect.set(exec->globalData(), thisObj, new (exec) QtRuntimeConnectionMethod(exec, ident, true, d->m_instance, d->m_index, d->m_signature)); + return d->m_connect.get(); } JSValue QtRuntimeMetaMethod::disconnectGetter(ExecState* exec, JSValue slotBase, const Identifier& ident) @@ -1533,8 +1531,8 @@ JSValue QtRuntimeMetaMethod::disconnectGetter(ExecState* exec, JSValue slotBase, QW_DS(QtRuntimeMetaMethod, thisObj); if (!d->m_disconnect) - d->m_disconnect = new (exec) QtRuntimeConnectionMethod(exec, ident, false, d->m_instance, d->m_index, d->m_signature); - return d->m_disconnect; + d->m_disconnect.set(exec->globalData(), thisObj, new (exec) QtRuntimeConnectionMethod(exec, ident, false, d->m_instance, d->m_index, d->m_signature)); + return d->m_disconnect.get(); } // =============== diff --git a/Source/WebCore/bridge/qt/qt_runtime.h b/Source/WebCore/bridge/qt/qt_runtime.h index 8dab08c..c5abca7 100644 --- a/Source/WebCore/bridge/qt/qt_runtime.h +++ b/Source/WebCore/bridge/qt/qt_runtime.h @@ -129,8 +129,8 @@ class QtRuntimeMetaMethodData : public QtRuntimeMethodData { QByteArray m_signature; bool m_allowPrivate; int m_index; - QtRuntimeConnectionMethod *m_connect; - QtRuntimeConnectionMethod *m_disconnect; + WriteBarrier<QtRuntimeConnectionMethod> m_connect; + WriteBarrier<QtRuntimeConnectionMethod> m_disconnect; }; class QtRuntimeConnectionMethodData : public QtRuntimeMethodData { diff --git a/Source/WebCore/bridge/runtime_root.cpp b/Source/WebCore/bridge/runtime_root.cpp index 515636d..5496e55 100644 --- a/Source/WebCore/bridge/runtime_root.cpp +++ b/Source/WebCore/bridge/runtime_root.cpp @@ -101,13 +101,15 @@ void RootObject::invalidate() return; { - HashSet<RuntimeObject*>::iterator end = m_runtimeObjects.end(); - for (HashSet<RuntimeObject*>::iterator it = m_runtimeObjects.begin(); it != end; ++it) - (*it)->invalidate(); - + WeakGCMap<RuntimeObject*, RuntimeObject>::iterator end = m_runtimeObjects.uncheckedEnd(); + for (WeakGCMap<RuntimeObject*, RuntimeObject>::iterator it = m_runtimeObjects.uncheckedBegin(); it != end; ++it) { + if (m_runtimeObjects.isValid(it)) + it->second->invalidate(); + } + m_runtimeObjects.clear(); } - + m_isValid = false; m_nativeHandle = 0; @@ -176,17 +178,19 @@ void RootObject::updateGlobalObject(JSGlobalObject* globalObject) void RootObject::addRuntimeObject(RuntimeObject* object) { ASSERT(m_isValid); - ASSERT(!m_runtimeObjects.contains(object)); - - m_runtimeObjects.add(object); -} - + ASSERT(!m_runtimeObjects.get(object)); + + m_runtimeObjects.set(object, object); +} + void RootObject::removeRuntimeObject(RuntimeObject* object) { - ASSERT(m_isValid); - ASSERT(m_runtimeObjects.contains(object)); - - m_runtimeObjects.remove(object); + if (!m_isValid) + return; + + ASSERT(m_runtimeObjects.uncheckedGet(object)); + + m_runtimeObjects.take(object); } } } // namespace JSC::Bindings diff --git a/Source/WebCore/bridge/runtime_root.h b/Source/WebCore/bridge/runtime_root.h index babd7ad..dde8a48 100644 --- a/Source/WebCore/bridge/runtime_root.h +++ b/Source/WebCore/bridge/runtime_root.h @@ -31,8 +31,8 @@ #endif #include <runtime/Protect.h> +#include <runtime/WeakGCMap.h> #include <wtf/Forward.h> -#include <wtf/HashSet.h> #include <wtf/Noncopyable.h> #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> @@ -89,7 +89,7 @@ private: ProtectedPtr<JSGlobalObject> m_globalObject; ProtectCountSet m_protectCountSet; - HashSet<RuntimeObject*> m_runtimeObjects; + WeakGCMap<RuntimeObject*, RuntimeObject> m_runtimeObjects; // Really need a WeakGCSet, but this will do. HashSet<InvalidationCallback*> m_invalidationCallbacks; }; |