⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chromeclientqt.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
字号:
/* * 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 "DatabaseTracker.h"#include "SecurityOrigin.h"#include "qwebpage.h"#include "qwebpage_p.h"#include "qwebframe_p.h"#include "qwebsecurityorigin.h"#include "qwebsecurityorigin_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 (!rect.isEmpty())                view->update(rect);        }        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::contentsSizeChanged(Frame* frame, const IntSize& size) const{    emit QWebFramePrivate::kit(frame)->contentsSizeChanged(size);}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* frame, const String& databaseName){    quint64 quota = QWebSettings::offlineStorageDefaultQuota();#if ENABLE(DATABASE)    if (!DatabaseTracker::tracker().hasEntryForOrigin(frame->document()->securityOrigin()))        DatabaseTracker::tracker().setQuota(frame->document()->securityOrigin(), quota);#endif    emit m_webPage->databaseQuotaExceeded(QWebFramePrivate::kit(frame), databaseName);}void ChromeClientQt::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> prpFileChooser){    RefPtr<FileChooser> fileChooser = prpFileChooser;    bool supportMulti = m_webPage->supportsExtension(QWebPage::ChooseMultipleFilesExtension);    if (fileChooser->allowsMultipleFiles() && supportMulti) {        QWebPage::ChooseMultipleFilesExtensionOption option;        option.parentFrame = QWebFramePrivate::kit(frame);        if (!fileChooser->filenames().isEmpty())            for (int i = 0; i < fileChooser->filenames().size(); ++i)                option.suggestedFileNames += fileChooser->filenames()[i];        QWebPage::ChooseMultipleFilesExtensionReturn output;        m_webPage->extension(QWebPage::ChooseMultipleFilesExtension, &option, &output);        if (!output.fileNames.isEmpty()) {            Vector<String> names;            for (int i = 0; i < output.fileNames.count(); ++i)                names.append(output.fileNames.at(i));            fileChooser->chooseFiles(names);        }    } else {        QString suggestedFile;        if (!fileChooser->filenames().isEmpty())            suggestedFile = fileChooser->filenames()[0];        QString file = m_webPage->chooseFile(QWebFramePrivate::kit(frame), suggestedFile);        if (!file.isEmpty())            fileChooser->chooseFile(file);    }}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -