diff options
Diffstat (limited to 'WebKit/qt/WebCoreSupport/ChromeClientQt.cpp')
-rw-r--r-- | WebKit/qt/WebCoreSupport/ChromeClientQt.cpp | 396 |
1 files changed, 396 insertions, 0 deletions
diff --git a/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp b/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp new file mode 100644 index 0000000..8a4de6b --- /dev/null +++ b/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp @@ -0,0 +1,396 @@ +/* + * Copyright (C) 2006 Zack Rusin <zack@kde.org> + * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "config.h" +#include "ChromeClientQt.h" + +#include "FileChooser.h" +#include "Frame.h" +#include "FrameLoadRequest.h" +#include "FrameLoader.h" +#include "FrameLoaderClientQt.h" +#include "FrameView.h" +#include "HitTestResult.h" +#include "NotImplemented.h" +#include "WindowFeatures.h" + +#include "qwebpage.h" +#include "qwebpage_p.h" +#include "qwebframe_p.h" + +#include <qtooltip.h> + +namespace WebCore +{ + + +ChromeClientQt::ChromeClientQt(QWebPage* webPage) + : m_webPage(webPage) +{ + toolBarsVisible = statusBarVisible = menuBarVisible = true; +} + +ChromeClientQt::~ChromeClientQt() +{ + +} + +void ChromeClientQt::setWindowRect(const FloatRect& rect) +{ + if (!m_webPage) + return; + emit m_webPage->geometryChangeRequested(QRect(qRound(rect.x()), qRound(rect.y()), + qRound(rect.width()), qRound(rect.height()))); +} + + +FloatRect ChromeClientQt::windowRect() +{ + if (!m_webPage) + return FloatRect(); + + QWidget* view = m_webPage->view(); + if (!view) + return FloatRect(); + return IntRect(view->topLevelWidget()->geometry()); +} + + +FloatRect ChromeClientQt::pageRect() +{ + if (!m_webPage) + return FloatRect(); + return FloatRect(QRectF(QPointF(0,0), m_webPage->viewportSize())); +} + + +float ChromeClientQt::scaleFactor() +{ + notImplemented(); + return 1; +} + + +void ChromeClientQt::focus() +{ + if (!m_webPage) + return; + QWidget* view = m_webPage->view(); + if (!view) + return; + + view->setFocus(); +} + + +void ChromeClientQt::unfocus() +{ + if (!m_webPage) + return; + QWidget* view = m_webPage->view(); + if (!view) + return; + view->clearFocus(); +} + +bool ChromeClientQt::canTakeFocus(FocusDirection) +{ + // This is called when cycling through links/focusable objects and we + // reach the last focusable object. Then we want to claim that we can + // take the focus to avoid wrapping. + return true; +} + +void ChromeClientQt::takeFocus(FocusDirection) +{ + // don't do anything. This is only called when cycling to links/focusable objects, + // which in turn is called from focusNextPrevChild. We let focusNextPrevChild + // call QWidget::focusNextPrevChild accordingly, so there is no need to do anything + // here. +} + + +Page* ChromeClientQt::createWindow(Frame*, const FrameLoadRequest& request, const WindowFeatures& features) +{ + QWebPage *newPage = m_webPage->createWindow(features.dialog ? QWebPage::WebModalDialog : QWebPage::WebBrowserWindow); + if (!newPage) + return 0; + newPage->mainFrame()->load(request.resourceRequest().url()); + return newPage->d->page; +} + +void ChromeClientQt::show() +{ + if (!m_webPage) + return; + QWidget* view = m_webPage->view(); + if (!view) + return; + view->topLevelWidget()->show(); +} + + +bool ChromeClientQt::canRunModal() +{ + notImplemented(); + return false; +} + + +void ChromeClientQt::runModal() +{ + notImplemented(); +} + + +void ChromeClientQt::setToolbarsVisible(bool visible) +{ + toolBarsVisible = visible; + emit m_webPage->toolBarVisibilityChangeRequested(visible); +} + + +bool ChromeClientQt::toolbarsVisible() +{ + return toolBarsVisible; +} + + +void ChromeClientQt::setStatusbarVisible(bool visible) +{ + emit m_webPage->statusBarVisibilityChangeRequested(visible); + statusBarVisible = visible; +} + + +bool ChromeClientQt::statusbarVisible() +{ + return statusBarVisible; + return false; +} + + +void ChromeClientQt::setScrollbarsVisible(bool) +{ + notImplemented(); +} + + +bool ChromeClientQt::scrollbarsVisible() +{ + notImplemented(); + return true; +} + + +void ChromeClientQt::setMenubarVisible(bool visible) +{ + menuBarVisible = visible; + emit m_webPage->menuBarVisibilityChangeRequested(visible); +} + +bool ChromeClientQt::menubarVisible() +{ + return menuBarVisible; +} + +void ChromeClientQt::setResizable(bool) +{ + notImplemented(); +} + +void ChromeClientQt::addMessageToConsole(const String& message, unsigned int lineNumber, + const String& sourceID) +{ + QString x = message; + QString y = sourceID; + m_webPage->javaScriptConsoleMessage(x, lineNumber, y); +} + +void ChromeClientQt::chromeDestroyed() +{ + delete this; +} + +bool ChromeClientQt::canRunBeforeUnloadConfirmPanel() +{ + return true; +} + +bool ChromeClientQt::runBeforeUnloadConfirmPanel(const String& message, Frame* frame) +{ + return runJavaScriptConfirm(frame, message); +} + +void ChromeClientQt::closeWindowSoon() +{ + m_webPage->mainFrame()->d->frame->loader()->stopAllLoaders(); + emit m_webPage->windowCloseRequested(); +} + +void ChromeClientQt::runJavaScriptAlert(Frame* f, const String& msg) +{ + QString x = msg; + FrameLoaderClientQt *fl = static_cast<FrameLoaderClientQt*>(f->loader()->client()); + m_webPage->javaScriptAlert(fl->webFrame(), x); +} + +bool ChromeClientQt::runJavaScriptConfirm(Frame* f, const String& msg) +{ + QString x = msg; + FrameLoaderClientQt *fl = static_cast<FrameLoaderClientQt*>(f->loader()->client()); + return m_webPage->javaScriptConfirm(fl->webFrame(), x); +} + +bool ChromeClientQt::runJavaScriptPrompt(Frame* f, const String& message, const String& defaultValue, String& result) +{ + QString x = result; + FrameLoaderClientQt *fl = static_cast<FrameLoaderClientQt*>(f->loader()->client()); + bool rc = m_webPage->javaScriptPrompt(fl->webFrame(), (QString)message, (QString)defaultValue, &x); + result = x; + return rc; +} + +void ChromeClientQt::setStatusbarText(const String& msg) +{ + QString x = msg; + emit m_webPage->statusBarMessage(x); +} + +bool ChromeClientQt::shouldInterruptJavaScript() +{ + notImplemented(); + return false; +} + +bool ChromeClientQt::tabsToLinks() const +{ + return m_webPage->settings()->testAttribute(QWebSettings::LinksIncludedInFocusChain); +} + +IntRect ChromeClientQt::windowResizerRect() const +{ + return IntRect(); +} + +void ChromeClientQt::repaint(const IntRect& windowRect, bool contentChanged, bool immediate, bool repaintContentOnly) +{ + // No double buffer, so only update the QWidget if content changed. + if (contentChanged) { + QWidget* view = m_webPage->view(); + if (view) { + QRect rect(windowRect); + rect = rect.intersected(QRect(QPoint(0, 0), m_webPage->viewportSize())); + if (!windowRect.isEmpty()) + view->update(windowRect); + } + emit m_webPage->repaintRequested(windowRect); + } + + // FIXME: There is no "immediate" support for window painting. This should be done always whenever the flag + // is set. +} + +void ChromeClientQt::scroll(const IntSize& delta, const IntRect& scrollViewRect, const IntRect&) +{ + QWidget* view = m_webPage->view(); + if (view) + view->scroll(delta.width(), delta.height(), scrollViewRect); + emit m_webPage->scrollRequested(delta.width(), delta.height(), scrollViewRect); +} + +IntRect ChromeClientQt::windowToScreen(const IntRect& rect) const +{ + notImplemented(); + return rect; +} + +IntPoint ChromeClientQt::screenToWindow(const IntPoint& point) const +{ + notImplemented(); + return point; +} + +PlatformWidget ChromeClientQt::platformWindow() const +{ + return m_webPage->view(); +} + +void ChromeClientQt::mouseDidMoveOverElement(const HitTestResult& result, unsigned modifierFlags) +{ + if (result.absoluteLinkURL() != lastHoverURL + || result.title() != lastHoverTitle + || result.textContent() != lastHoverContent) { + lastHoverURL = result.absoluteLinkURL(); + lastHoverTitle = result.title(); + lastHoverContent = result.textContent(); + emit m_webPage->linkHovered(lastHoverURL.prettyURL(), + lastHoverTitle, lastHoverContent); + } +} + +void ChromeClientQt::setToolTip(const String &tip) +{ +#ifndef QT_NO_TOOLTIP + QWidget* view = m_webPage->view(); + if (!view) + return; + + if (tip.isEmpty()) { + view->setToolTip(QString()); + QToolTip::hideText(); + } else { + QString dtip = QLatin1String("<p>") + tip + QLatin1String("</p>"); + view->setToolTip(dtip); + } +#else + Q_UNUSED(tip); +#endif +} + +void ChromeClientQt::print(Frame *frame) +{ + emit m_webPage->printRequested(QWebFramePrivate::kit(frame)); +} + +void ChromeClientQt::exceededDatabaseQuota(Frame*, const String&) +{ + notImplemented(); +} + +void ChromeClientQt::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> prpFileChooser) +{ + // FIXME: Support multiple files. + + RefPtr<FileChooser> fileChooser = prpFileChooser; + QString suggestedFile = fileChooser->filenames()[0]; + QString file = m_webPage->chooseFile(QWebFramePrivate::kit(frame), suggestedFile); + if (!file.isEmpty()) + fileChooser->chooseFile(file); +} + +} |