add proper error messages to the FrameLoaderClient.
authorlars <lars@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 5 Oct 2007 08:57:12 +0000 (08:57 +0000)
committerlars <lars@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 5 Oct 2007 08:57:12 +0000 (08:57 +0000)
Implement ChromeClientQt::closeWindowSoon and
FrameLoaderClientQt::dispatchCreatePage (which should go
away IMO).
Some fixes in DRT to make it work correctly with multiple
windows.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@26062 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/qt/Api/qwebframe.h
WebKit/qt/Api/qwebnetworkinterface.cpp
WebKit/qt/ChangeLog
WebKit/qt/WebCoreSupport/ChromeClientQt.cpp
WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp
WebKitTools/ChangeLog
WebKitTools/DumpRenderTree/qt/DumpRenderTree.cpp
WebKitTools/DumpRenderTree/qt/DumpRenderTree.h
WebKitTools/DumpRenderTree/qt/jsobjects.cpp
WebKitTools/DumpRenderTree/qt/jsobjects.h

index e18bdad40e972a8276047747adf098f85bab6dd8..10d10a418117f7c0026d5cdca7ccd6e0d85006c1 100644 (file)
@@ -40,6 +40,7 @@ class QWebPage;
 namespace WebCore {
     class WidgetPrivate;
     class FrameLoaderClientQt;
+    class ChromeClientQt;
 }
 class QWebFrameData;
 
@@ -98,6 +99,7 @@ private:
     friend class QWebPagePrivate;
     friend class WebCore::WidgetPrivate;
     friend class WebCore::FrameLoaderClientQt;
+    friend class WebCore::ChromeClientQt;
     QWebFramePrivate *d;
 };
 
index f37311e590dfbe0f3de17d1663ea99d3c068f1fb..b6e824d97fbf2631e3873af1a56a12611f91bbd5 100644 (file)
@@ -409,6 +409,7 @@ void QWebNetworkManager::cancel(ResourceHandle *handle)
     QWebNetworkJob *job = handle->getInternal()->m_job;
     if (!job)
         return;
+    //DEBUG() << "QWebNetworkManager::cancel:" <<  job->d->request.httpHeader.toString();
     job->d->resourceHandle = 0;
     job->d->connector = 0;
     job->d->interface->cancelJob(job);
@@ -785,7 +786,8 @@ void QWebNetworkInterface::addJob(QWebNetworkJob *job)
 
     if (!(protocol.isEmpty() || protocol == QLatin1String("file"))) {
         statusCode = 404;
-    } else if (job->postData().isEmpty()) {
+    } else {
+        // we simply ignore post data here.
         QFile f(path);
         DEBUG() << "opening" << QString(url.path());
 
@@ -797,8 +799,6 @@ void QWebNetworkInterface::addJob(QWebNetworkJob *job)
         } else {
             statusCode = 404;
         }
-    } else {
-        statusCode = 404;
     }
     d->sendFileData(job, statusCode, data);
 }
index 3f98e964fa96f0ac3702dd434f97d8a0cf407313..56a95706c73d611c90bad131abe4f76aadafb61c 100644 (file)
@@ -1,3 +1,27 @@
+2007-10-05  Lars Knoll  <lars@trolltech.com>
+
+        add proper error messages to the FrameLoaderClient.
+        Implement ChromeClientQt::closeWindowSoon and
+        FrameLoaderClientQt::dispatchCreatePage (which should go away IMO).
+        Some fixes in DRT to make it work correctly with multiple windows.
+
+        Reviewed by Maciej.
+
+        * Api/qwebframe.h:
+        * Api/qwebnetworkinterface.cpp:
+        (QWebNetworkManager::cancel):
+        (QWebNetworkInterface::addJob):
+        * WebCoreSupport/ChromeClientQt.cpp:
+        (WebCore::ChromeClientQt::closeWindowSoon):
+        * WebCoreSupport/FrameLoaderClientQt.cpp:
+        (WebCore::FrameLoaderClientQt::cancelledError):
+        (WebCore::):
+        (WebCore::FrameLoaderClientQt::blockedError):
+        (WebCore::FrameLoaderClientQt::cannotShowURLError):
+        (WebCore::FrameLoaderClientQt::interruptForPolicyChangeError):
+        (WebCore::FrameLoaderClientQt::cannotShowMIMETypeError):
+        (WebCore::FrameLoaderClientQt::dispatchCreatePage):
+
 2007-10-03  Lars Knoll  <lars@trolltech.com>
 
         Signed off by Olliej.
index ee516f2496e7c50b7bf33b59b09c1b161f25e72d..982523b15bc418dee01f4c389284fd6a9e5fdb62 100644 (file)
@@ -37,6 +37,7 @@
 
 #include "qwebpage.h"
 #include "qwebpage_p.h"
+#include "qwebframe_p.h"
 
 namespace WebCore
 {
@@ -240,7 +241,8 @@ bool ChromeClientQt::runBeforeUnloadConfirmPanel(const String& message, Frame* f
 
 void ChromeClientQt::closeWindowSoon()
 {
-    notImplemented();
+    m_webPage->mainFrame()->d->frame->loader()->stopAllLoaders();
+    m_webPage->deleteLater();
 }
 
 void ChromeClientQt::runJavaScriptAlert(Frame* f, const String& msg)
index 9721511916edfb4c7d9c6f3875c007fb0b764b3f..ab24ecfac01640919345a2a0fc72a701af64396b 100644 (file)
@@ -649,41 +649,46 @@ void FrameLoaderClientQt::committedLoad(WebCore::DocumentLoader* loader, const c
     fl->addData(data, length);
 }
 
-WebCore::ResourceError FrameLoaderClientQt::cancelledError(const WebCore::ResourceRequest&)
+WebCore::ResourceError FrameLoaderClientQt::cancelledError(const WebCore::ResourceRequest& request)
 {
-    notImplemented();
-    return ResourceError();
+    return ResourceError("Error", -999, request.url().prettyURL(), QObject::tr("QWebFrame", "Request cancelled"));
 }
 
-WebCore::ResourceError FrameLoaderClientQt::blockedError(const WebCore::ResourceRequest&)
+// copied from WebKit/Misc/WebKitErrors[Private].h
+enum {
+    WebKitErrorCannotShowMIMEType =                             100,
+    WebKitErrorCannotShowURL =                                  101,
+    WebKitErrorFrameLoadInterruptedByPolicyChange =             102,
+    WebKitErrorCannotUseRestrictedPort = 103, 
+    WebKitErrorCannotFindPlugIn =                               200,
+    WebKitErrorCannotLoadPlugIn =                               201,
+    WebKitErrorJavaUnavailable =                                202,
+};
+    
+WebCore::ResourceError FrameLoaderClientQt::blockedError(const WebCore::ResourceRequest& request)
 {
-    notImplemented();
-    return ResourceError();
+    return ResourceError("Error", WebKitErrorCannotUseRestrictedPort, request.url().prettyURL(), QObject::tr("QWebFrame", "Request blocked"));
 }
 
 
-WebCore::ResourceError FrameLoaderClientQt::cannotShowURLError(const WebCore::ResourceRequest&)
+WebCore::ResourceError FrameLoaderClientQt::cannotShowURLError(const WebCore::ResourceRequest& request)
 {
-    notImplemented();
-    return ResourceError();
+    return ResourceError("Error", WebKitErrorCannotShowURL, request.url().url(), QObject::tr("QWebFrame", "Cannot show URL"));
 }
 
-WebCore::ResourceError FrameLoaderClientQt::interruptForPolicyChangeError(const WebCore::ResourceRequest&)
+WebCore::ResourceError FrameLoaderClientQt::interruptForPolicyChangeError(const WebCore::ResourceRequest& request)
 {
-    notImplemented();
-    return ResourceError();
+    return ResourceError("Error", WebKitErrorFrameLoadInterruptedByPolicyChange, request.url().url(), QObject::tr("QWebFrame", "Frame load interruped by policy change"));
 }
 
-WebCore::ResourceError FrameLoaderClientQt::cannotShowMIMETypeError(const WebCore::ResourceResponse&)
+WebCore::ResourceError FrameLoaderClientQt::cannotShowMIMETypeError(const WebCore::ResourceResponse& response)
 {
-    notImplemented();
-    return ResourceError();
+    return ResourceError("Error", WebKitErrorCannotShowMIMEType, response.url().url(), QObject::tr("QWebFrame", "Cannot show mimetype"));
 }
 
-WebCore::ResourceError FrameLoaderClientQt::fileDoesNotExistError(const WebCore::ResourceResponse&)
+WebCore::ResourceError FrameLoaderClientQt::fileDoesNotExistError(const WebCore::ResourceResponse& response)
 {
-    notImplemented();
-    return ResourceError();
+    return ResourceError("Error", -998 /* ### */, response.url().url(), QObject::tr("QWebFrame", "File does not exist"));
 }
 
 bool FrameLoaderClientQt::shouldFallBack(const WebCore::ResourceError&)
@@ -769,8 +774,10 @@ void FrameLoaderClientQt::dispatchDidFailLoad(const WebCore::ResourceError&)
 
 WebCore::Frame* FrameLoaderClientQt::dispatchCreatePage()
 {
-    notImplemented();
-    return 0;
+    if (!m_webFrame)
+        return 0;
+    QWebPage *newPage = m_webFrame->page()->createWindow();
+    return newPage->mainFrame()->d->frame.get();
 }
 
 void FrameLoaderClientQt::dispatchDecidePolicyForMIMEType(FramePolicyFunction function, const WebCore::String&, const WebCore::ResourceRequest&)
index 91baa7e38a29465db2a7bb4f3e35d1b1e65e741c..b28c63d3eb2274b9256bc8d540cb884f18404884 100644 (file)
@@ -1,3 +1,22 @@
+2007-10-05  Lars Knoll  <lars@trolltech.com>
+
+        add proper error messages to the FrameLoaderClient.
+        Implement ChromeClientQt::closeWindowSoon and
+        FrameLoaderClientQt::dispatchCreatePage (which should go away IMO).
+        Some fixes in DRT to make it work correctly with multiple windows.
+
+        Reviewed by Maciej.
+
+        * DumpRenderTree/qt/DumpRenderTree.cpp:
+        (WebCore::DumpRenderTree::DumpRenderTree):
+        (WebCore::DumpRenderTree::createWindow):
+        (WebCore::DumpRenderTree::windowCount):
+        * DumpRenderTree/qt/DumpRenderTree.h:
+        * DumpRenderTree/qt/jsobjects.cpp:
+        (LayoutTestController::maybeDump):
+        (LayoutTestController::windowCount):
+        * DumpRenderTree/qt/jsobjects.h:
+
 2007-10-05  Lars Knoll  <lars@trolltech.com>
 
         Add a dummy plugin to DRT  to fix fast/dom/Window/Plug-Ins.html.
index 4c64528f974ffed9cc5eb9896ba4be54b1e90c9b..fc42e6c43ffaf1c4729da2e079adc03903bcdedb 100644 (file)
@@ -124,7 +124,7 @@ DumpRenderTree::DumpRenderTree()
     : m_stdin(0)
     , m_notifier(0)
 {
-    m_controller = new LayoutTestController();
+    m_controller = new LayoutTestController(this);
     connect(m_controller, SIGNAL(done()), this, SLOT(dump()), Qt::QueuedConnection);
 
     m_page = new WebPage(0, this);
@@ -263,10 +263,19 @@ QWebPage *DumpRenderTree::createWindow()
     container->resize(0, 0);
     container->move(-1, -1);
     container->hide();
-    QWebPage *page = new QWebPage(container);
+    QWebPage *page = new WebPage(container, this);
     windows.append(container);
     return page;
 }
-    
+
+int DumpRenderTree::windowCount() const
+{
+    int count = 0;
+    foreach(QWidget *w, windows) {
+        if (w->children().count())
+            ++count;
+    }
+    return count + 1;
 }
 
+}
index 8aa5ee874f71ab078ab0840444eb0b46c644ec2f..6a6f1e4fb9d538b63d58cb80b3d41246437583d8 100644 (file)
@@ -33,7 +33,6 @@
 #include <QObject>
 #include <QTextStream>
 #include <QSocketNotifier>
-
 class QUrl;
 class QFile;
 class QWebPage;
@@ -63,6 +62,8 @@ public:
     EventSender *eventSender() const { return m_eventSender; }
 
     QWebPage *createWindow();
+    int windowCount() const;
+
 public Q_SLOTS:
     void initJSObjects();
     void readStdin(int);
index 66bce92a9eae2698a33c8f0fcc8ab76e493218d4..2e3a8f08783d11a3ec8902de0c440ee011004e18 100644 (file)
@@ -31,6 +31,8 @@
 #include <qevent.h>
 #include <qapplication.h>
 
+#include "DumpRenderTree.h"
+
 class HackWebFrame : public QWebFrame
 {
 public:
@@ -50,7 +52,9 @@ protected:
     ~HackWebFrame() {}
 };
 
-LayoutTestController::LayoutTestController() : QObject()
+LayoutTestController::LayoutTestController(WebCore::DumpRenderTree *drt)
+    : QObject()
+    , m_drt(drt)
 {
     m_timeoutTimer = 0;
     reset();
@@ -78,7 +82,7 @@ void LayoutTestController::maybeDump(bool ok)
 
     m_topLoadingFrame = 0;
 
-    if (!ok || !shouldWaitUntilDone()) {
+    if (!shouldWaitUntilDone()) {
         emit done();
         m_isLoading = false;
     }
@@ -102,6 +106,11 @@ void LayoutTestController::notifyDone()
     m_isLoading = false;
 }
 
+int LayoutTestController::windowCount()
+{
+    return m_drt->windowCount();
+}
+
 void LayoutTestController::dumpEditingCallbacks()
 {
     //qDebug() << ">>>dumpEditingCallbacks";
index 7bd314c929fea9d2f87f5e918dd03f1b4562d1ba..f66f520422c8d20f4e4e0adb1736ec8167ac9166 100644 (file)
 #include <qpoint.h>
 
 class QWebFrame;
-
+namespace WebCore {
+    class DumpRenderTree;
+}
 class LayoutTestController : public QObject
 {
     Q_OBJECT
 public:
-    LayoutTestController();
+    LayoutTestController(WebCore::DumpRenderTree *drt);
 
     bool isLoading() const { return m_isLoading; }
     void setLoading(bool loading) { m_isLoading = loading; }
@@ -66,6 +68,8 @@ public slots:
     void dumpEditingCallbacks();
     void queueReload();
     void provisionalLoad();
+    void setCloseRemainingWindowsWhenComplete(bool) {}
+    int windowCount();
 
 private:
     bool m_isLoading;
@@ -75,6 +79,7 @@ private:
     bool m_waitForDone;
     int m_timeoutTimer;
     QWebFrame *m_topLoadingFrame;
+    WebCore::DumpRenderTree *m_drt;
 };
 
 class QWebPage;