Title: [125253] trunk/Source
Revision
125253
Author
[email protected]
Date
2012-08-09 22:45:33 -0700 (Thu, 09 Aug 2012)

Log Message

[Qt] Remove support for __qt_sender__ in QObject bridge
https://bugs.webkit.org/show_bug.cgi?id=93649

Patch by Simon Hausmann <[email protected]> on 2012-08-09
Reviewed by Kenneth Rohde Christiansen.

Support for __qt_sender__ has also been removed from QtScript/QJSEngine. The right
_javascript_ solution to the problem is Function.prototype.bind.

Source/WebCore:

* bridge/qt/qt_instance.cpp:
(Bindings):
* bridge/qt/qt_instance.h:
* bridge/qt/qt_runtime.cpp:
(Bindings):
(JSC::Bindings::QtConnectionObject::execute):

Source/WebKit/qt:

* Api/qwebframe.cpp:
(QWebFramePrivate::didClearWindowObject):
* Api/qwebframe_p.h:
(QWebFramePrivate):
* tests/qobjectbridge/tst_qobjectbridge.cpp:
(tst_QObjectBridge::connectAndDisconnect):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (125252 => 125253)


--- trunk/Source/WebCore/ChangeLog	2012-08-10 05:14:13 UTC (rev 125252)
+++ trunk/Source/WebCore/ChangeLog	2012-08-10 05:45:33 UTC (rev 125253)
@@ -1,3 +1,20 @@
+2012-08-09  Simon Hausmann  <[email protected]>
+
+        [Qt] Remove support for __qt_sender__ in QObject bridge
+        https://bugs.webkit.org/show_bug.cgi?id=93649
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Support for __qt_sender__ has also been removed from QtScript/QJSEngine. The right
+        _javascript_ solution to the problem is Function.prototype.bind.
+
+        * bridge/qt/qt_instance.cpp:
+        (Bindings):
+        * bridge/qt/qt_instance.h:
+        * bridge/qt/qt_runtime.cpp:
+        (Bindings):
+        (JSC::Bindings::QtConnectionObject::execute):
+
 2012-08-09  Shane Stephens  <[email protected]>
 
         Convert CSSParser's m_reusableSelectorVector to OwnPtr and rename to m_selectorVector.

Modified: trunk/Source/WebCore/bridge/qt/qt_instance.cpp (125252 => 125253)


--- trunk/Source/WebCore/bridge/qt/qt_instance.cpp	2012-08-10 05:14:13 UTC (rev 125252)
+++ trunk/Source/WebCore/bridge/qt/qt_instance.cpp	2012-08-10 05:45:33 UTC (rev 125253)
@@ -44,9 +44,6 @@
 typedef QMultiHash<void*, QtInstance*> QObjectInstanceMap;
 static QObjectInstanceMap cachedInstances;
 
-// Used for implementing '__qt_sender__'.
-Q_GLOBAL_STATIC(QtInstance::QtSenderStack, senderStack)
-
 // Derived RuntimeObject
 class QtRuntimeObject : public RuntimeObject {
 public:
@@ -314,11 +311,6 @@
     return stringValue(exec);
 }
 
-QtInstance::QtSenderStack* QtInstance::qtSenderStack()
-{
-    return senderStack();
-}
-
 // In qt_runtime.cpp
 JSValue convertQVariantToValue(ExecState*, PassRefPtr<RootObject> root, const QVariant& variant);
 QVariant convertValueToQVariant(ExecState*, JSValue, QMetaType::Type hint, int *distance);

Modified: trunk/Source/WebCore/bridge/qt/qt_instance.h (125252 => 125253)


--- trunk/Source/WebCore/bridge/qt/qt_instance.h	2012-08-10 05:14:13 UTC (rev 125252)
+++ trunk/Source/WebCore/bridge/qt/qt_instance.h	2012-08-10 05:45:33 UTC (rev 125253)
@@ -85,9 +85,6 @@
         QStack<QObject*> m_stack;
     };
 
-    // Used to implement '__qt_sender__'.
-    static QtSenderStack* qtSenderStack();
-
 private:
 
     class QtWeakObjectReference {

Modified: trunk/Source/WebCore/bridge/qt/qt_runtime.cpp (125252 => 125253)


--- trunk/Source/WebCore/bridge/qt/qt_runtime.cpp	2012-08-10 05:14:13 UTC (rev 125252)
+++ trunk/Source/WebCore/bridge/qt/qt_runtime.cpp	2012-08-10 05:45:33 UTC (rev 125253)
@@ -1862,13 +1862,6 @@
 }
 // End of moc-generated code
 
-static bool isJavaScriptFunction(JSObjectRef object)
-{
-    CallData callData;
-    JSObject* jsObject = toJS(object);
-    return jsObject->methodTable()->getCallData(jsObject, callData) == CallTypeJS;
-}
-
 void QtConnectionObject::execute(void** argv)
 {
     QObject* sender = m_senderInstance->getObject();
@@ -1897,14 +1890,7 @@
         args[i] = ::toRef(exec, convertQVariantToValue(exec, rootObject, QVariant(argType, argv[i+1])));
     }
 
-    const bool updateQtSender = isJavaScriptFunction(m_receiverFunction);
-    if (updateQtSender)
-        QtInstance::qtSenderStack()->push(QObject::sender());
-
     JSObjectCallAsFunction(m_context, m_receiverFunction, m_receiver, argc, args.data(), 0);
-
-    if (updateQtSender)
-        QtInstance::qtSenderStack()->pop();
 }
 
 bool QtConnectionObject::match(JSContextRef context, QObject* sender, int signalIndex, JSObjectRef receiver, JSObjectRef receiverFunction)

Modified: trunk/Source/WebKit/qt/Api/qwebframe.cpp (125252 => 125253)


--- trunk/Source/WebKit/qt/Api/qwebframe.cpp	2012-08-10 05:14:13 UTC (rev 125252)
+++ trunk/Source/WebKit/qt/Api/qwebframe.cpp	2012-08-10 05:45:33 UTC (rev 125253)
@@ -488,45 +488,9 @@
 
 void QWebFramePrivate::didClearWindowObject()
 {
-    if (page->settings()->testAttribute(QWebSettings::_javascript_Enabled))
-        addQtSenderToGlobalObject();
     emit q->_javascript_WindowObjectCleared();
 }
 
-static JSValueRef qtSenderCallback(JSContextRef context, JSObjectRef, JSObjectRef, size_t, const JSValueRef[], JSValueRef*)
-{
-    QObject* sender = JSC::Bindings::QtInstance::qtSenderStack()->top();
-    if (!sender)
-        return JSValueMakeUndefined(context);
-
-    JSC::ExecState* exec = ::toJS(context);
-    RefPtr<JSC::Bindings::RootObject> rootObject = JSC::Bindings::findRootObject(exec->dynamicGlobalObject());
-    JSC::JSObject* jsSender = JSC::Bindings::QtInstance::getQtInstance(sender, rootObject, JSC::Bindings::QtInstance::QtOwnership)->createRuntimeObject(exec);
-    return ::toRef(jsSender);
-}
-
-void QWebFramePrivate::addQtSenderToGlobalObject()
-{
-    JSDOMWindow* window = toJSDOMWindow(frame, mainThreadNormalWorld());
-    Q_ASSERT(window);
-
-    JSC::ExecState* exec = window->globalExec();
-    Q_ASSERT(exec);
-    JSC::JSLockHolder lock(exec);
-
-    JSContextRef context = ::toRef(exec);
-    JSRetainPtr<JSStringRef> propertyName(Adopt, JSStringCreateWithUTF8CString("__qt_sender__"));
-    JSObjectRef function = JSObjectMakeFunctionWithCallback(context, propertyName.get(), qtSenderCallback);
-
-    // JSC public API doesn't support setting a Getter for a property of a given object, https://bugs.webkit.org/show_bug.cgi?id=61374.
-    JSC::PropertyDescriptor descriptor;
-    descriptor.setGetter(::toJS(function));
-    descriptor.setSetter(JSC::jsUndefined());
-    descriptor.setEnumerable(false);
-    descriptor.setConfigurable(false);
-    window->methodTable()->defineOwnProperty(window, exec, propertyName.get()->identifier(&exec->globalData()), descriptor, false);
-}
-
 /*!
     \class QWebFrame
     \since 4.4

Modified: trunk/Source/WebKit/qt/Api/qwebframe_p.h (125252 => 125253)


--- trunk/Source/WebKit/qt/Api/qwebframe_p.h	2012-08-10 05:14:13 UTC (rev 125252)
+++ trunk/Source/WebKit/qt/Api/qwebframe_p.h	2012-08-10 05:45:33 UTC (rev 125253)
@@ -129,11 +129,6 @@
 #if ENABLE(ORIENTATION_EVENTS)
     QOrientationSensor m_orientation;
 #endif // ENABLE(ORIENTATION_EVENTS).
-
-private:
-#if USE(JSC)
-    void addQtSenderToGlobalObject();
-#endif
 };
 
 class QWebHitTestResultPrivate {

Modified: trunk/Source/WebKit/qt/ChangeLog (125252 => 125253)


--- trunk/Source/WebKit/qt/ChangeLog	2012-08-10 05:14:13 UTC (rev 125252)
+++ trunk/Source/WebKit/qt/ChangeLog	2012-08-10 05:45:33 UTC (rev 125253)
@@ -1,3 +1,20 @@
+2012-08-09  Simon Hausmann  <[email protected]>
+
+        [Qt] Remove support for __qt_sender__ in QObject bridge
+        https://bugs.webkit.org/show_bug.cgi?id=93649
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Support for __qt_sender__ has also been removed from QtScript/QJSEngine. The right
+        _javascript_ solution to the problem is Function.prototype.bind.
+
+        * Api/qwebframe.cpp:
+        (QWebFramePrivate::didClearWindowObject):
+        * Api/qwebframe_p.h:
+        (QWebFramePrivate):
+        * tests/qobjectbridge/tst_qobjectbridge.cpp:
+        (tst_QObjectBridge::connectAndDisconnect):
+
 2012-08-08  Simon Hausmann  <[email protected]>
 
         [Qt] Port internal findMethodIndex method matcher to use JSC C API

Modified: trunk/Source/WebKit/qt/tests/qobjectbridge/tst_qobjectbridge.cpp (125252 => 125253)


--- trunk/Source/WebKit/qt/tests/qobjectbridge/tst_qobjectbridge.cpp	2012-08-10 05:14:13 UTC (rev 125252)
+++ trunk/Source/WebKit/qt/tests/qobjectbridge/tst_qobjectbridge.cpp	2012-08-10 05:45:33 UTC (rev 125253)
@@ -1417,7 +1417,7 @@
         QCOMPARE(type, sError);
     }
 
-    evalJS("myHandler = function() { window.gotSignal = true; window.signalArgs = arguments; window.slotThisObject = this; window.signalSender = __qt_sender__; }");
+    evalJS("myHandler = function() { window.gotSignal = true; window.signalArgs = arguments; window.slotThisObject = this; }");
 
     QCOMPARE(evalJS("myObject.mySignal.connect(myHandler)"), sUndefined);
 
@@ -1425,7 +1425,6 @@
     evalJS("myObject.mySignal()");
     QCOMPARE(evalJS("gotSignal"), sTrue);
     QCOMPARE(evalJS("signalArgs.length == 0"), sTrue);
-    QCOMPARE(evalJS("signalSender"), evalJS("myObject"));
     QCOMPARE(evalJS("slotThisObject == window"), sTrue);
 
     evalJS("gotSignal = false");
@@ -1489,7 +1488,6 @@
     QCOMPARE(evalJS("gotSignal"), sTrue);
     QCOMPARE(evalJS("signalArgs.length == 0"), sTrue);
     QCOMPARE(evalJS("slotThisObject"), evalJS("otherObject"));
-    QCOMPARE(evalJS("signalSender"), evalJS("myObject"));
     QCOMPARE(evalJS("slotThisObject.name"), QLatin1String("foo"));
     QCOMPARE(evalJS("myObject.mySignal.disconnect(otherObject, myHandler)"), sUndefined);
 
@@ -1500,7 +1498,6 @@
     QCOMPARE(evalJS("gotSignal"), sTrue);
     QCOMPARE(evalJS("signalArgs.length == 1"), sTrue);
     QCOMPARE(evalJS("slotThisObject == yetAnotherObject"), sTrue);
-    QCOMPARE(evalJS("signalSender == myObject"), sTrue);
     QCOMPARE(evalJS("slotThisObject.name"), QLatin1String("bar"));
     QCOMPARE(evalJS("myObject.mySignal2.disconnect(yetAnotherObject, myHandler)"), sUndefined);
 
@@ -1510,7 +1507,6 @@
     QCOMPARE(evalJS("gotSignal"), sTrue);
     QCOMPARE(evalJS("signalArgs.length == 1"), sTrue);
     QCOMPARE(evalJS("slotThisObject == myObject"), sTrue);
-    QCOMPARE(evalJS("signalSender == myObject"), sTrue);
     QCOMPARE(evalJS("myObject.mySignal2.disconnect(myObject, myHandler)"), sUndefined);
 
     // connect(obj, string)
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to