[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