+2007-06-06 Lars Knoll <lars@trolltech.com>
+
+ Reviewed by Zack
+
+ Add an API to create and load plugins.
+ Don't include moc files by hand anymore, rather let
+ qmake handle them.
+
+ * WebCore.pro:
+ * platform/qt/MimeTypeRegistryQt.cpp:
+ (WebCore::):
+ (WebCore::MimeTypeRegistry::getMIMETypeForExtension):
+ * platform/qt/QWebPopup.cpp:
+ * platform/qt/SharedTimerQt.cpp:
+
2007-06-06 Mark Rowe <mrowe@apple.com>
Qt build fix.
INCLUDEPATH += /usr/include/libxml2
LIBS += -lxml2 -lxslt
}
+
qt-port {
INCLUDEPATH += \
$$[QT_INSTALL_PREFIX]/src/3rdparty/sqlite/ \
STYLESHEETS_EMBED = $$PWD/css/html4.css
-MANUALMOC =
-qt-port:MANUALMOC += \
- $$PWD/platform/qt/QWebPopup.h \
- $$PWD/platform/qt/SharedTimerQt.h \
- $$PWD/../WebKitQt/Api/qwebframe.h \
- $$PWD/../WebKitQt/Api/qwebpage.h \
- $$PWD/../WebKitQt/Api/qwebnetworkinterface.h \
- $$PWD/../WebKitQt/Api/qwebnetworkinterface_p.h \
- $$PWD/../WebKitQt/Api/qcookiejar.h \
- $$PWD/../WebKitQt/WebCoreSupport/FrameLoaderClientQt.h
-
LUT_FILES += \
bindings/js/JSXMLHttpRequest.cpp \
bindings/js/JSXSLTProcessor.cpp \
xml/XSLStyleSheet.cpp \
xml/XSLTProcessor.cpp
+qt-port:HEADERS += \
+ $$PWD/platform/qt/QWebPopup.h \
+ $$PWD/platform/qt/SharedTimerQt.h \
+ $$PWD/../WebKitQt/Api/qwebframe.h \
+ $$PWD/../WebKitQt/Api/qwebpage.h \
+ $$PWD/../WebKitQt/Api/qwebnetworkinterface.h \
+ $$PWD/../WebKitQt/Api/qwebnetworkinterface_p.h \
+ $$PWD/../WebKitQt/Api/qwebobjectplugin.h \
+ $$PWD/../WebKitQt/Api/qwebobjectplugin_p.h \
+ $$PWD/../WebKitQt/Api/qcookiejar.h \
+ $$PWD/../WebKitQt/WebCoreSupport/FrameLoaderClientQt.h
+
qt-port:SOURCES += \
page/qt/DragControllerQt.cpp \
page/qt/EventHandlerQt.cpp \
../WebKitQt/Api/qcookiejar.cpp \
../WebKitQt/Api/qwebpage.cpp \
../WebKitQt/Api/qwebpagehistory.cpp \
- ../WebKitQt/Api/qwebsettings.cpp
+ ../WebKitQt/Api/qwebsettings.cpp \
+ ../WebKitQt/Api/qwebobjectplugin.cpp
gdk-port:SOURCES += \
platform/TextCodecICU.cpp \
stylesheets.clean = ${QMAKE_FILE_OUT} tmp/UserAgentStyleSheets.h
QMAKE_EXTRA_COMPILERS += stylesheets
-# GENERATOR M
-manual_moc.output = tmp/${QMAKE_FILE_BASE}.moc
-manual_moc.commands = $$QMAKE_MOC ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT}
-manual_moc.input = MANUALMOC
-manual_moc.CONFIG += target_predeps no_link
-QMAKE_EXTRA_COMPILERS += manual_moc
-
# GENERATOR 10: XPATH grammar
xpathbison.output = tmp/${QMAKE_FILE_BASE}.cpp
xpathbison.commands = bison -d -p xpathyy ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_BASE}.tab.c && mv ${QMAKE_FILE_BASE}.tab.c tmp/${QMAKE_FILE_BASE}.cpp && mv ${QMAKE_FILE_BASE}.tab.h tmp/${QMAKE_FILE_BASE}.h
#include "MimeTypeRegistry.h"
#include "NotImplemented.h"
-namespace WebCore
+#include "qwebobjectplugin_p.h"
+
+namespace WebCore
{
struct ExtensionMap {
{ "bmp", "image/bmp" },
{ "gif", "image/gif" },
{ "html", "text/html" },
- { "ico", "image/x-icon" },
+ { "ico", "image/x-icon" },
{ "jpeg", "image/jpeg" },
{ "jpg", "image/jpeg" },
{ "js", "application/x-javascript" },
{ "xhtml", "application/xhtml+xml" },
{ 0, 0 }
};
-
+
String MimeTypeRegistry::getMIMETypeForExtension(const String &ext)
{
String s = ext.lower();
+
const ExtensionMap *e = extensionMap;
while (e->extension) {
if (s == e->extension)
return e->mimeType;
++e;
}
- // unknown, let's just assume plain text
- return "text/plain";
+ QString type = QWebFactoryLoader::self()->mimeTypeForExtension(ext);
+ if (!type.isEmpty())
+ return type;
+
+ return "application/octet-stream";
}
}
#include <QCoreApplication>
#include <QMouseEvent>
-#include "QWebPopup.moc"
-
namespace WebCore {
QWebPopup::QWebPopup(PopupMenuClient* client)
}
-#include "SharedTimerQt.moc"
-
// vim: ts=4 sw=4 et
}
return gJar;
}
-
-
-#include "qcookiejar.moc"
{
viewport()->scroll(dx, dy);
}
-
-#include "qwebframe.moc"
}
}
-#include "qwebnetworkinterface_p.moc"
-#include "qwebnetworkinterface.moc"
-
--- /dev/null
+#include "qwebobjectplugin_p.h"
+#include <qcoreapplication.h>
+
+#ifndef QT_NO_LIBRARY
+Q_GLOBAL_STATIC_WITH_ARGS(QWebFactoryLoader, loader,
+ (QWebObjectPluginFactoryInterface_iid, QCoreApplication::libraryPaths(), QLatin1String("/webplugins")))
+#endif
+
+
+QWebFactoryLoader::QWebFactoryLoader(const char *iid, const QStringList &paths, const QString &suffix, Qt::CaseSensitivity)
+ : QFactoryLoader(iid, paths, suffix)
+{
+ QStringList plugins = keys();
+ foreach(QString k, plugins) {
+ QWebObjectPlugin *plugin = qobject_cast<QWebObjectPlugin *>(instance(k));
+ if (!plugin)
+ continue;
+ QStringList extensions = plugin->extensionsForMimetype(k);
+ foreach(QString ext, extensions) {
+ m_extensions.append(ext);
+ m_mimeTypesForExtension.append(k);
+ }
+ }
+}
+
+QWebFactoryLoader *QWebFactoryLoader::self()
+{
+ return loader();
+}
+
+QString QWebFactoryLoader::mimeTypeForExtension(const QString &extension)
+{
+ int idx = m_extensions.indexOf(extension);
+ if (idx > 0)
+ return m_mimeTypesForExtension.at(idx);
+ return QString();
+}
+
+QObject *QWebFactoryLoader::create(QWidget *parent,
+ const QString &mimeType,
+ const QStringList &argumentNames,
+ const QStringList &argumentValues)
+{
+ QWebObjectPlugin *plugin = qobject_cast<QWebObjectPlugin *>(instance(mimeType));
+ if (!plugin)
+ return 0;
+ return plugin->create(parent, mimeType, argumentNames, argumentValues);
+}
+
+
+
+/*! \class QWebObjectPlugin
+
+ This class is a plugin for the HTML object tag. It can be used to embed arbitrary content in a web page.
+*/
+
+
+QWebObjectPlugin::QWebObjectPlugin(QObject *parent)
+ : QObject(parent)
+{
+}
+
+QWebObjectPlugin::~QWebObjectPlugin()
+{
+}
+
+/*!
+ \fn QStringList QWebObjectPlugin::keys() const
+
+ The keys are the mimetypes the plugin can handle
+*/
+
+/*!
+ \fn QStringList QWebObjectPlugin::extensionsForMimetype() const
+
+ Should return a list of extensions that are recognised to match the \a mimeType.
+*/
+QStringList QWebObjectPlugin::extensionsForMimetype(const QString &mimeType) const
+{
+ return QStringList();
+}
+
+/*!
+ \fn QObject *QWebObjectPlugin::create(QWidget *parent, const QString &mimeType, const QStringList &argumentNames, const QStringList &argumentValues) const
+
+ Creates a QObject with \a parent to handle \a mimeType. \a argumentNames and \a argumentValues are a set of key-value pairs passed directly
+ from the <param> elements contained in the HTML object tag.
+*/
+
--- /dev/null
+#ifndef QWEBOBJECTPLUGIN_H
+#define QWEBOBJECTPLUGIN_H
+
+#include <qwebkitglobal.h>
+#include <QtCore/qplugin.h>
+#include <QtCore/qfactoryinterface.h>
+
+struct QWEBKIT_EXPORT QWebObjectPluginFactoryInterface : public QFactoryInterface
+{
+ virtual QObject *create(QWidget *parent,
+ const QString &mimeType,
+ const QStringList &argumentNames,
+ const QStringList &argumentValues) const = 0;
+};
+
+#define QWebObjectPluginFactoryInterface_iid "com.trolltech.Qt.QWebObjectPluginFactoryInterface"
+Q_DECLARE_INTERFACE(QWebObjectPluginFactoryInterface, QWebObjectPluginFactoryInterface_iid)
+
+class QWEBKIT_EXPORT QWebObjectPlugin : public QObject, public QWebObjectPluginFactoryInterface
+{
+ Q_OBJECT
+ Q_INTERFACES(QWebObjectPluginFactoryInterface:QFactoryInterface)
+public:
+ explicit QWebObjectPlugin(QObject *parent = 0);
+ virtual ~QWebObjectPlugin();
+
+ virtual QStringList keys() const = 0;
+ virtual QStringList extensionsForMimetype(const QString &mimeType) const;
+ virtual QObject *create(QWidget *parent,
+ const QString &mimeType,
+ const QStringList &argumentNames,
+ const QStringList &argumentValues) const = 0;
+};
+
+#endif
--- /dev/null
+#ifndef QWEBOBJECTPLUGIN_P_H
+#define QWEBOBJECTPLUGIN_P_H
+
+#include <qglobal.h>
+#include <qwebobjectplugin.h>
+
+#include <private/qfactoryloader_p.h>
+
+class QWebFactoryLoader : public QFactoryLoader
+{
+ Q_OBJECT
+public:
+ QWebFactoryLoader(const char *iid,
+ const QStringList &paths = QStringList(),
+ const QString &suffix = QString(),
+ Qt::CaseSensitivity = Qt::CaseSensitive);
+
+ static QWebFactoryLoader *self();
+
+ QStringList mimeTypes() { return keys(); }
+ QStringList extensions() { return m_extensions; }
+
+ QString mimeTypeForExtension(const QString &extension);
+ bool supportsMimeType(const QString &mimeType) { return keys().contains(mimeType); }
+
+ QObject *create(QWidget *parent,
+ const QString &mimeType,
+ const QStringList &argumentNames,
+ const QStringList &argumentValues);
+
+private:
+ QStringList m_extensions;
+ QStringList m_mimeTypesForExtension;
+};
+
+#endif
return settings;
}
-
-
-#include "qwebpage.moc"
+2007-06-06 Lars Knoll <lars@trolltech.com>
+
+ Reviewed by Zack
+
+ Add an API to create and load plugins.
+ Don't include moc files by hand anymore, rather let
+ qmake handle them.
+
+ * Api/qcookiejar.cpp:
+ (QCookieJar::cookieJar):
+ * Api/qwebframe.cpp:
+ (QWebFrame::scrollContentsBy):
+ * Api/qwebnetworkinterface.cpp:
+ * Api/qwebobjectplugin.cpp: Added.
+ (QWebFactoryLoader::QWebFactoryLoader):
+ (QWebFactoryLoader::self):
+ (QWebFactoryLoader::mimeTypeForExtension):
+ (QWebFactoryLoader::create):
+ (QWebObjectPlugin::QWebObjectPlugin):
+ (QWebObjectPlugin::~QWebObjectPlugin):
+ (QWebObjectPlugin::extensionsForMimetype):
+ * Api/qwebobjectplugin.h: Added.
+ * Api/qwebobjectplugin_p.h: Added.
+ (QWebFactoryLoader::mimeTypes):
+ (QWebFactoryLoader::extensions):
+ (QWebFactoryLoader::supportsMimeType):
+ * Api/qwebpage.cpp:
+ (QWebPage::settings):
+ * WebCoreSupport/FrameLoaderClientQt.cpp:
+ (WebCore::FrameLoaderClientQt::dispatchDidHandleOnloadEvents):
+ (WebCore::FrameLoaderClientQt::postProgressEstimateChangedNotification):
+ (WebCore::FrameLoaderClientQt::objectContentType):
+ (WebCore::FrameLoaderClientQt::createPlugin):
+
2007-05-28 Zack Rusin <zrusin@trolltech.com>
Reviewed by andersca and simon
#include "qwebpage.h"
#include "qwebframe.h"
#include "qwebframe_p.h"
+#include "qwebobjectplugin_p.h"
#include <qfileinfo.h>
void FrameLoaderClientQt::dispatchDidHandleOnloadEvents()
{
-
+ // don't need this one
}
void FrameLoaderClientQt::postProgressEstimateChangedNotification()
{
if (m_webFrame && m_frame->page())
- emit loadProgressChanged(m_frame->page()->progress()->estimatedProgress() * 100);
+ emit loadProgressChanged(qRound(m_frame->page()->progress()->estimatedProgress() * 100));
}
void FrameLoaderClientQt::postProgressFinishedNotification()
return false;
}
-
bool FrameLoaderClientQt::representationExistsForURLScheme(const String& URLScheme) const
{
notImplemented();
return childFrame.get();
}
-ObjectContentType FrameLoaderClientQt::objectContentType(const KURL& url, const String& mimeType)
+ObjectContentType FrameLoaderClientQt::objectContentType(const KURL& url, const String& _mimeType)
{
+ //qDebug()<<" ++++++++++++++++ url is "<<url.prettyURL()<<", mime = "<<mimeType;
if (!url.isValid())
- return ObjectContentType();
-
- //This is not really correct. it works because getMIMETypeForExtension
- // currently returns only the mimetypes that frames can handle
- QFileInfo fi(url.path());
- String rtype = MimeTypeRegistry::getMIMETypeForExtension(fi.suffix());
- if (!rtype.isEmpty())
+ return ObjectContentNone;
+
+ String mimeType = _mimeType;
+ if (!mimeType.length()) {
+ QFileInfo fi(url.path());
+ mimeType = MimeTypeRegistry::getMIMETypeForExtension(fi.suffix());
+ }
+
+ if (!mimeType.length())
+ return ObjectContentFrame;
+
+ if (MimeTypeRegistry::isSupportedImageMIMEType(mimeType))
+ return ObjectContentImage;
+
+ if (QWebFactoryLoader::self()->supportsMimeType(mimeType))
+ return ObjectContentPlugin;
+
+ if (MimeTypeRegistry::isSupportedNonImageMIMEType(mimeType))
return ObjectContentFrame;
- return ObjectContentType();
+
+ return ObjectContentNone;
}
-Widget* FrameLoaderClientQt::createPlugin(Element*, const KURL&, const Vector<String>&, const Vector<String>&, const String&, bool)
+Widget* FrameLoaderClientQt::createPlugin(Element* element, const KURL& url, const Vector<String>& paramNames,
+ const Vector<String>& paramValues, const String& mimeType, bool loadManually)
{
- notImplemented();
+ //qDebug()<<"------ Creating plugin in FrameLoaderClientQt::createPlugin for "<<mimeType;
+ //qDebug()<<"------\t url = "<<url.prettyURL();
+ QStringList params;
+ QStringList values;
+ for (int i = 0; i < paramNames.size(); ++i)
+ params.append(paramNames[i]);
+ for (int i = 0; i < paramValues.size(); ++i)
+ values.append(paramValues[i]);
+
+ QObject *object = QWebFactoryLoader::self()->create(m_webFrame->viewport(), mimeType, params, values);
+ if (object) {
+ QWidget *widget = qobject_cast<QWidget *>(object);
+ if (widget) {
+ Widget* w= new Widget();
+ w->setQWidget(widget);
+ return w;
+ }
+ // FIXME: make things work for widgetless plugins as well
+ delete object;
+ }
+
return 0;
}
}
}
-
-#include "FrameLoaderClientQt.moc"