[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.21-584-g1e41756

eric at webkit.org eric at webkit.org
Fri Feb 26 22:25:11 UTC 2010


The following commit has been merged in the webkit-1.1 branch:
commit d4020ee760b10860bcdb3f5ed6b1639d398d9379
Author: eric at webkit.org <eric at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Feb 18 21:50:59 2010 +0000

    2010-02-18  Noam Rosenthal  <noam.rosenthal at nokia.com>
    
            Reviewed by Kenneth Rohde Christiansen.
    
            [Qt] Minor improvement to hybrid QPixmap
            https://bugs.webkit.org/show_bug.cgi?id=34507
            Instead of having toHTMLImageElement which creates a new element,
            assignToHTMLImageElement would set an existing HTML <img/> element to
            contain the native QPixmap/QImge.
            Also made some style fixes.
    
            Additions to existing tests: see WebKit/qt/tests
    
            * bridge/qt/qt_pixmapruntime.cpp:
            (JSC::Bindings::QtPixmapWidthField::valueFromInstance): style
            (JSC::Bindings::QtPixmapHeightField::valueFromInstance): style
            (JSC::Bindings::QtPixmapAssignToElementMethod::name): assignTo
            (JSC::Bindings::QtPixmapAssignToElementMethod::invoke): new function
            (JSC::Bindings::QtPixmapAssignToElementMethod::numParameters): 1
            (JSC::Bindings::QtPixmapToDataUrlMethod::invoke): style
            (JSC::Bindings::QtPixmapToStringMethod::invoke): style
            (JSC::Bindings::QtPixmapInstance::invokeMethod): style
            (JSC::Bindings::QtPixmapClass::methodsNamed): new func, removed old
            (JSC::Bindings::QtPixmapInstance::getPropertyNames): ditto
            (JSC::Bindings::QtPixmapInstance::defaultValue): style
            (JSC::Bindings::QtPixmapInstance::valueOf): style
            (JSC::Bindings::QtPixmapInstance::toPixmap): style
            (JSC::Bindings::QtPixmapInstance::variantFromObject): style
    2010-02-18  Noam Rosenthal  <noam.rosenthal at nokia.com>
    
            Reviewed by Kenneth Rohde Christiansen.
    
            [Qt] Minor improvement to hybrid QPixmap
            https://bugs.webkit.org/show_bug.cgi?id=34507
    
            * tests/hybridPixmap/test.html: use assignToHTMLImageElement on an
            existing element instead of toHTMLImageElement which creates a new one
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@54986 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 7aeb62e..218f3e4 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,32 @@
+2010-02-18  Noam Rosenthal  <noam.rosenthal at nokia.com>
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        [Qt] Minor improvement to hybrid QPixmap
+        https://bugs.webkit.org/show_bug.cgi?id=34507
+        Instead of having toHTMLImageElement which creates a new element,
+        assignToHTMLImageElement would set an existing HTML <img/> element to
+        contain the native QPixmap/QImge.
+        Also made some style fixes.
+
+        Additions to existing tests: see WebKit/qt/tests
+
+        * bridge/qt/qt_pixmapruntime.cpp:
+        (JSC::Bindings::QtPixmapWidthField::valueFromInstance): style
+        (JSC::Bindings::QtPixmapHeightField::valueFromInstance): style
+        (JSC::Bindings::QtPixmapAssignToElementMethod::name): assignTo
+        (JSC::Bindings::QtPixmapAssignToElementMethod::invoke): new function
+        (JSC::Bindings::QtPixmapAssignToElementMethod::numParameters): 1
+        (JSC::Bindings::QtPixmapToDataUrlMethod::invoke): style
+        (JSC::Bindings::QtPixmapToStringMethod::invoke): style
+        (JSC::Bindings::QtPixmapInstance::invokeMethod): style
+        (JSC::Bindings::QtPixmapClass::methodsNamed): new func, removed old
+        (JSC::Bindings::QtPixmapInstance::getPropertyNames): ditto
+        (JSC::Bindings::QtPixmapInstance::defaultValue): style
+        (JSC::Bindings::QtPixmapInstance::valueOf): style
+        (JSC::Bindings::QtPixmapInstance::toPixmap): style
+        (JSC::Bindings::QtPixmapInstance::variantFromObject): style
+
 2010-02-18  Peter Kasting  <pkasting at google.com>
 
         Not reviewed, bustage fix.
diff --git a/WebCore/bridge/qt/qt_pixmapruntime.cpp b/WebCore/bridge/qt/qt_pixmapruntime.cpp
index edae5a9..5978804 100644
--- a/WebCore/bridge/qt/qt_pixmapruntime.cpp
+++ b/WebCore/bridge/qt/qt_pixmapruntime.cpp
@@ -20,11 +20,7 @@
 #include "qt_pixmapruntime.h"
 
 #include "CachedImage.h"
-#include "DOMWindow.h"
 #include "HTMLImageElement.h"
-#include "HTMLNames.h"
-#include "JSDOMBinding.h"
-#include "JSDOMWindow.h"
 #include "JSGlobalObject.h"
 #include "JSHTMLImageElement.h"
 #include "JSLock.h"
@@ -54,18 +50,19 @@ public:
 class QtPixmapWidthField : public Field {
 public:
     static const char* name() { return "width"; }
-    virtual JSValue valueFromInstance(ExecState* exec, const Instance* pixmap) const
+    virtual JSValue valueFromInstance(ExecState* exec, const Instance* instance) const
     {
-        return jsNumber(exec, static_cast<const QtPixmapInstance*>(pixmap)->width());
+        return jsNumber(exec, static_cast<const QtPixmapInstance*>(instance)->width());
     }
     virtual void setValueToInstance(ExecState*, const Instance*, JSValue) const {}
 };
+
 class QtPixmapHeightField : public Field {
 public:
     static const char* name() { return "height"; }
-    virtual JSValue valueFromInstance(ExecState* exec, const Instance* inst) const
+    virtual JSValue valueFromInstance(ExecState* exec, const Instance* instance) const
     {
-        return jsNumber(exec, static_cast<const QtPixmapInstance*>(inst)->height());
+        return jsNumber(exec, static_cast<const QtPixmapInstance*>(instance)->height());
     }
     virtual void setValueToInstance(ExecState*, const Instance*, JSValue) const {}
 };
@@ -76,77 +73,68 @@ public:
     {
         return 0;
     }
-    virtual JSValue invoke(ExecState* exec, QVariant&, PassRefPtr<RootObject> root, QtPixmapInstance* inst) = 0;
+    virtual JSValue invoke(ExecState* exec, QtPixmapInstance*, const ArgList&) = 0;
 
 };
 
-class QtPixmapCreateElementMethod : public QtPixmapRuntimeMethod {
+// this function receives an HTML image element as a parameter, makes it display the pixmap/image from Qt
+class QtPixmapAssignToElementMethod : public QtPixmapRuntimeMethod {
 public:
-    static const char* name() { return "toHTMLImageElement"; }
-    JSValue invoke(ExecState* exec, QVariant& v, PassRefPtr<RootObject> root, QtPixmapInstance*)
+    static const char* name() { return "assignToHTMLImageElement"; }
+    JSValue invoke(ExecState* exec, QtPixmapInstance* instance, const ArgList& args)
     {
-        QPixmap pxm;
-        if (v.type() == static_cast<QVariant::Type>(qMetaTypeId<QImage>())) {
-            pxm = QPixmap::fromImage(v.value<QImage>());
-            v = QVariant::fromValue<QPixmap>(pxm);
-        } else
-            pxm = v.value<QPixmap>();
-
-        Document* document = 0;
-        JSDOMGlobalObject* global = static_cast<JSDOMGlobalObject*>(root->globalObject());
-        if (global) {
-            DOMWindow* dWindow = toDOMWindow(global);
-            if (dWindow)
-                document = dWindow->document();
-        }
-
-        if (document) {
-            PassRefPtr<StillImage> img = WebCore::StillImage::create(pxm);
-            RefPtr<HTMLImageElement> image = new HTMLImageElement(HTMLNames::imgTag, document);
-            image->setCachedImage(new CachedImage(img.get()));
-            toJS(exec, global, document);
-            return asObject(toJS(exec, global, image.release()));
-        }
+        if (!args.size())
+            return jsUndefined();
+
+        JSObject* objectArg = args.at(0).toObject(exec);
+        if (!objectArg)
+            return jsUndefined();
+
+        if (!objectArg->inherits(&JSHTMLImageElement::s_info))
+            return jsUndefined();
+
+        // we now know that we have a valid <img> element as the argument, we can attach the pixmap to it.
+        PassRefPtr<StillImage> stillImage = WebCore::StillImage::create(instance->toPixmap());
+        HTMLImageElement* imageElement = static_cast<HTMLImageElement*>(static_cast<JSHTMLImageElement*>(objectArg)->impl());
+        imageElement->setCachedImage(new CachedImage(stillImage.get()));
+        JSDOMGlobalObject* global = static_cast<JSDOMGlobalObject*>(instance->rootObject()->globalObject());
+        toJS(exec, global, imageElement->document());
         return jsUndefined();
     }
 
+    virtual int numParameters() const
+    {
+        return 1;
+    }
 };
 
+// this function encodes the image to a dataUrl, to be used in background etc. Note: very slow.
 class QtPixmapToDataUrlMethod : public QtPixmapRuntimeMethod {
 public:
     static const char* name() { return "toDataUrl"; }
-    JSValue invoke(ExecState* exec, QVariant& v, PassRefPtr<RootObject> root, QtPixmapInstance*)
+    JSValue invoke(ExecState* exec, QtPixmapInstance* instance, const ArgList&)
     {
-        QImage image;
-        // for getting the data url, we always prefer the image.
-        if (v.type() == static_cast<QVariant::Type>(qMetaTypeId<QPixmap>())) {
-            image = v.value<QPixmap>().toImage();
-            v = QVariant::fromValue<QImage>(image);
-        } else
-            image = v.value<QImage>();
-        QByteArray ba;
-        QBuffer b(&ba);
-        image.save(&b, "PNG");
-        const QString b64 = QString("data:image/png;base64,") + ba.toBase64();
-        const UString ustring((UChar*)b64.utf16(), b64.length());
+        QByteArray byteArray;
+        QBuffer buffer(&byteArray);
+        instance->toImage().save(&buffer, "PNG");
+        const QString encodedString = QString("data:image/png;base64,") + byteArray.toBase64();
+        const UString ustring((UChar*)encodedString.utf16(), encodedString.length());
         return jsString(exec, ustring);
     }
-
 };
 
 class QtPixmapToStringMethod : public QtPixmapRuntimeMethod {
     public:
     static const char* name() { return "toString"; }
-    JSValue invoke(ExecState* exec, QVariant& v, PassRefPtr<RootObject> root, QtPixmapInstance* inst)
+    JSValue invoke(ExecState* exec, QtPixmapInstance* instance, const ArgList&)
     {
-        return inst->valueOf(exec);
+        return instance->valueOf(exec);
     }
-
 };
 
 struct QtPixmapMetaData {
     QtPixmapToDataUrlMethod toDataUrlMethod;
-    QtPixmapCreateElementMethod createElementMethod;
+    QtPixmapAssignToElementMethod assignToElementMethod;
     QtPixmapToStringMethod toStringMethod;
     QtPixmapHeightField heightField;
     QtPixmapWidthField widthField;
@@ -179,7 +167,6 @@ QtPixmapRuntimeObjectImp::QtPixmapRuntimeObjectImp(ExecState* exec, PassRefPtr<I
 
 const ClassInfo QtPixmapRuntimeObjectImp::s_info = { "QtPixmapRuntimeObject", &RuntimeObjectImp::s_info, 0, 0 };
 
-
 QtPixmapClass::QtPixmapClass()
 {
 }
@@ -193,8 +180,8 @@ Class* QtPixmapInstance::getClass() const
 JSValue QtPixmapInstance::invokeMethod(ExecState* exec, const MethodList& methods, const ArgList& args)
 {
     if (methods.size() == 1) {
-        QtPixmapRuntimeMethod* mtd = static_cast<QtPixmapRuntimeMethod*>(methods[0]);        
-        return mtd->invoke(exec, data, rootObject(), this);
+        QtPixmapRuntimeMethod* method = static_cast<QtPixmapRuntimeMethod*>(methods[0]);
+        return method->invoke(exec, this, args);
     }
     return jsUndefined();
 }
@@ -204,8 +191,8 @@ MethodList QtPixmapClass::methodsNamed(const Identifier& identifier, Instance*)
     MethodList methods;
     if (identifier == QtPixmapToDataUrlMethod::name())
         methods.append(&qt_pixmap_metaData.toDataUrlMethod);
-    else if (identifier == QtPixmapCreateElementMethod::name())
-        methods.append(&qt_pixmap_metaData.createElementMethod);
+    else if (identifier == QtPixmapAssignToElementMethod::name())
+        methods.append(&qt_pixmap_metaData.assignToElementMethod);
     else if (identifier == QtPixmapToStringMethod::name())
         methods.append(&qt_pixmap_metaData.toStringMethod);
     return methods;
@@ -223,7 +210,7 @@ Field* QtPixmapClass::fieldNamed(const Identifier& identifier, Instance*) const
 void QtPixmapInstance::getPropertyNames(ExecState*exec, PropertyNameArray& arr)
 {
     arr.add(Identifier(exec, UString(QtPixmapToDataUrlMethod::name())));
-    arr.add(Identifier(exec, UString(QtPixmapCreateElementMethod::name())));
+    arr.add(Identifier(exec, UString(QtPixmapAssignToElementMethod::name())));
     arr.add(Identifier(exec, UString(QtPixmapToStringMethod::name())));
     arr.add(Identifier(exec, UString(QtPixmapWidthField::name())));
     arr.add(Identifier(exec, UString(QtPixmapHeightField::name())));
@@ -236,15 +223,17 @@ JSValue QtPixmapInstance::defaultValue(ExecState* exec, PreferredPrimitiveType p
                 (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QImage>()) && !(data.value<QImage>()).isNull())
                 || (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QPixmap>()) && !data.value<QPixmap>().isNull()));
     }
+
     if (ptype == PreferString)
         return valueOf(exec);
+
     return jsUndefined();
 }
 
 JSValue QtPixmapInstance::valueOf(ExecState* exec) const
 {
-    const QString toStr = QString("[Qt Native Pixmap %1,%2]").arg(width()).arg(height());
-    UString ustring((UChar*)toStr.utf16(), toStr.length());
+    const QString stringValue = QString("[Qt Native Pixmap %1,%2]").arg(width()).arg(height());
+    UString ustring((UChar*)stringValue.utf16(), stringValue.length());
     return jsString(exec, ustring);
 }
 
@@ -275,62 +264,78 @@ QPixmap QtPixmapInstance::toPixmap()
 {
     if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QPixmap>()))
         return data.value<QPixmap>();
+
     if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QImage>())) {
-        const QPixmap pxm = QPixmap::fromImage(data.value<QImage>());
-        data = QVariant::fromValue<QPixmap>(pxm);
-        return pxm;
+        const QPixmap pixmap = QPixmap::fromImage(data.value<QImage>());
+        data = QVariant::fromValue<QPixmap>(pixmap);
+        return pixmap;
     }
-    return QPixmap();
 
+    return QPixmap();
 }
 
 QImage QtPixmapInstance::toImage()
 {
     if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QImage>()))
         return data.value<QImage>();
+
     if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QPixmap>())) {
-        const QImage img = data.value<QPixmap>().toImage();
-        data = QVariant::fromValue<QImage>(img);
-        return img;
+        const QImage image = data.value<QPixmap>().toImage();
+        data = QVariant::fromValue<QImage>(image);
+        return image;
     }
+
     return QImage();
 }
 
 QVariant QtPixmapInstance::variantFromObject(JSObject* object, QMetaType::Type hint)
 {
-    if (!object) {
+    if (!object)
+        goto returnEmptyVariant;
+
+    if (object->inherits(&JSHTMLImageElement::s_info)) {
+        JSHTMLImageElement* elementJSWrapper = static_cast<JSHTMLImageElement*>(object);
+        HTMLImageElement* imageElement = static_cast<HTMLImageElement*>(elementJSWrapper->impl());
+
+        if (!imageElement)
+            goto returnEmptyVariant;
+
+        CachedImage* cachedImage = imageElement->cachedImage();
+        if (!cachedImage)
+            goto returnEmptyVariant;
+
+        Image* image = cachedImage->image();
+        if (!image)
+            goto returnEmptyVariant;
+
+        QPixmap* pixmap = image->nativeImageForCurrentFrame();
+        if (!pixmap)
+            goto returnEmptyVariant;
+
+        return (hint == static_cast<QMetaType::Type>(qMetaTypeId<QPixmap>()))
+                  ? QVariant::fromValue<QPixmap>(*pixmap)
+                  : QVariant::fromValue<QImage>(pixmap->toImage());
+    }
+
+    if (object->inherits(&QtPixmapRuntimeObjectImp::s_info)) {
+        QtPixmapRuntimeObjectImp* imp = static_cast<QtPixmapRuntimeObjectImp*>(object);
+        QtPixmapInstance* instance = static_cast<QtPixmapInstance*>(imp->getInternalInstance());
+        if (!instance)
+            goto returnEmptyVariant;
+
         if (hint == qMetaTypeId<QPixmap>())
-            return QVariant::fromValue<QPixmap>(QPixmap());
+            return QVariant::fromValue<QPixmap>(instance->toPixmap());
+
         if (hint == qMetaTypeId<QImage>())
-            return QVariant::fromValue<QImage>(QImage());
-    } else if (object->inherits(&JSHTMLImageElement::s_info)) {
-        JSHTMLImageElement* el = static_cast<JSHTMLImageElement*>(object);
-        HTMLImageElement* imageElement = static_cast<HTMLImageElement*>(el->impl());
-        if (imageElement) {
-            CachedImage* cImg = imageElement->cachedImage();
-            if (cImg) {
-                Image* img = cImg->image();
-                if (img) {
-                    QPixmap* pxm = img->nativeImageForCurrentFrame();
-                    if (pxm) {
-                        return (hint == static_cast<QMetaType::Type>(qMetaTypeId<QPixmap>()))
-                              ? QVariant::fromValue<QPixmap>(*pxm)
-                              : QVariant::fromValue<QImage>(pxm->toImage());
-                    }
-                }
-            }
-        }
-    } else if (object->inherits(&QtPixmapRuntimeObjectImp::s_info)) {
-        QtPixmapRuntimeObjectImp* imp = static_cast<QtPixmapRuntimeObjectImp*>(object);
-        QtPixmapInstance* inst = static_cast<QtPixmapInstance*>(imp->getInternalInstance());
-        if (inst) {
-            if (hint == qMetaTypeId<QPixmap >())
-                return QVariant::fromValue<QPixmap>(inst->toPixmap());
-            if (hint == qMetaTypeId<QImage>())
-                return QVariant::fromValue<QImage>(inst->toImage());
-        }
+            return QVariant::fromValue<QImage>(instance->toImage());
     }
-    return 0;
+
+returnEmptyVariant:
+    if (hint == qMetaTypeId<QPixmap>())
+        return QVariant::fromValue<QPixmap>(QPixmap());
+    if (hint == qMetaTypeId<QImage>())
+        return QVariant::fromValue<QImage>(QImage());
+    return QVariant();
 }
 JSObject* QtPixmapInstance::createRuntimeObject(ExecState* exec, PassRefPtr<RootObject> root, const QVariant& data)
 {
diff --git a/WebKit/qt/ChangeLog b/WebKit/qt/ChangeLog
index d589995..fb832b3 100644
--- a/WebKit/qt/ChangeLog
+++ b/WebKit/qt/ChangeLog
@@ -1,3 +1,13 @@
+2010-02-18  Noam Rosenthal  <noam.rosenthal at nokia.com>
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        [Qt] Minor improvement to hybrid QPixmap
+        https://bugs.webkit.org/show_bug.cgi?id=34507
+
+        * tests/hybridPixmap/test.html: use assignToHTMLImageElement on an
+        existing element instead of toHTMLImageElement which creates a new one
+
 2010-02-17  Dmitry Titov  <dimich at chromium.org>
 
         Reviewed by David Levin, Darin Fisher, Simon Hausmann.
diff --git a/WebKit/qt/tests/hybridPixmap/test.html b/WebKit/qt/tests/hybridPixmap/test.html
index ddaf75c..0f2c345 100644
--- a/WebKit/qt/tests/hybridPixmap/test.html
+++ b/WebKit/qt/tests/hybridPixmap/test.html
@@ -9,11 +9,17 @@
                 var obj = myWidget.image;
                 var pxm = myWidget.pixmap;
 
-                var img = obj.toHTMLImageElement();
+                var img = new Image;
+                obj.assignToHTMLImageElement(img);
                 var img1 = document.getElementById("img1");
                 var img2 = document.getElementById("img2");
+                var img3 = document.getElementById("img3");
+                var img4 = document.getElementById("img4");
                 document.body.appendChild(img);
-                document.body.appendChild(pxm.toHTMLImageElement());
+                obj.assignToHTMLImageElement(img3);
+                pxm.assignToHTMLImageElement(img4);
+                myWidget.compare(pxm.width, img4.width);
+                myWidget.compare(obj.width, img3.width);
                 var signalsFired = 0;
                 myWidget.compare(obj.toString(),"[Qt Native Pixmap "+obj.width+","+obj.height+"]");
                 myWidget.compare(String(pxm),"[Qt Native Pixmap "+pxm.width+","+pxm.height+"]");
@@ -53,5 +59,7 @@
     <body onload="startTest()">
         <img id="img1" />
         <img id="img2" />
+        <img id="img3" />
+        <img id="img4" />
     </body>
 </html>

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list