summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/bridge
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-05-18 13:36:51 +0100
committerSteve Block <steveblock@google.com>2011-05-24 15:38:28 +0100
commit2fc2651226baac27029e38c9d6ef883fa32084db (patch)
treee396d4bf89dcce6ed02071be66212495b1df1dec /Source/WebCore/bridge
parentb3725cedeb43722b3b175aaeff70552e562d2c94 (diff)
downloadexternal_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.cpp1
-rw-r--r--Source/WebCore/bridge/qt/qt_class.cpp2
-rw-r--r--Source/WebCore/bridge/qt/qt_instance.cpp18
-rw-r--r--Source/WebCore/bridge/qt/qt_instance.h4
-rw-r--r--Source/WebCore/bridge/qt/qt_runtime.cpp26
-rw-r--r--Source/WebCore/bridge/qt/qt_runtime.h4
-rw-r--r--Source/WebCore/bridge/runtime_root.cpp32
-rw-r--r--Source/WebCore/bridge/runtime_root.h4
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;
};