2 * Copyright (C) 2006 Zack Rusin <zack@kde.org>
3 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
4 * Copyright (C) 2007-2008 Trolltech ASA
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
21 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
25 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #include "CSSComputedStyleDeclaration.h"
32 #include "CSSPropertyNames.h"
33 #include "FrameLoaderClientQt.h"
34 #include "FrameTree.h"
35 #include "FrameView.h"
36 #include "DocumentLoader.h"
37 #include "MIMETypeRegistry.h"
38 #include "ResourceResponse.h"
40 #include "PluginData.h"
41 #include "ProgressTracker.h"
42 #include "ResourceRequest.h"
43 #include "HistoryItem.h"
44 #include "HTMLFormElement.h"
45 #include "NotImplemented.h"
46 #include "QNetworkReplyHandler.h"
47 #include "ResourceHandleInternal.h"
48 #include "ResourceHandle.h"
51 #include "qwebframe.h"
52 #include "qwebframe_p.h"
53 #include "qwebhistoryinterface.h"
54 #include "qwebpluginfactory.h"
56 #include <qfileinfo.h>
58 #include <QCoreApplication>
60 #if QT_VERSION >= 0x040400
61 #include <QNetworkRequest>
62 #include <QNetworkReply>
64 #include "qwebnetworkinterface_p.h"
70 FrameLoaderClientQt::FrameLoaderClientQt()
76 connect(this, SIGNAL(sigCallPolicyFunction(int)), this, SLOT(slotCallPolicyFunction(int)), Qt::QueuedConnection);
80 FrameLoaderClientQt::~FrameLoaderClientQt()
84 void FrameLoaderClientQt::setFrame(QWebFrame* webFrame, Frame* frame)
86 m_webFrame = webFrame;
88 if (!m_webFrame || !m_webFrame->page()) {
89 qWarning("FrameLoaderClientQt::setFrame frame without Page!");
93 connect(this, SIGNAL(loadStarted()),
94 m_webFrame, SIGNAL(loadStarted()));
95 connect(this, SIGNAL(loadProgressChanged(int)),
96 m_webFrame->page(), SIGNAL(loadProgressChanged(int)));
97 connect(this, SIGNAL(loadFinished()),
98 m_webFrame, SIGNAL(loadFinished()));
99 connect(this, SIGNAL(titleChanged(const QString&)),
100 m_webFrame, SIGNAL(titleChanged(const QString&)));
103 QWebFrame* FrameLoaderClientQt::webFrame() const
108 void FrameLoaderClientQt::callPolicyFunction(FramePolicyFunction function, PolicyAction action)
110 ASSERT(!m_policyFunction);
113 m_policyFunction = function;
114 emit sigCallPolicyFunction(action);
117 void FrameLoaderClientQt::slotCallPolicyFunction(int action)
119 if (!m_frame || !m_policyFunction)
121 FramePolicyFunction function = m_policyFunction;
122 m_policyFunction = 0;
123 (m_frame->loader()->*function)(WebCore::PolicyAction(action));
126 bool FrameLoaderClientQt::hasWebView() const
133 bool FrameLoaderClientQt::hasFrameView() const
139 void FrameLoaderClientQt::savePlatformDataToCachedPage(CachedPage*)
144 void FrameLoaderClientQt::transitionToCommittedFromCachedPage(CachedPage*)
149 void FrameLoaderClientQt::transitionToCommittedForNewPage()
151 // qDebug() << "FrameLoaderClientQt::makeDocumentView" << m_frame->document();
153 // if (!m_frame->document())
154 // m_frame->loader()->createEmptyDocument();
158 void FrameLoaderClientQt::makeRepresentation(DocumentLoader*)
160 // don't need this for now I think.
164 void FrameLoaderClientQt::forceLayout()
166 m_frame->forceLayout(true);
170 void FrameLoaderClientQt::forceLayoutForNonHTML()
175 void FrameLoaderClientQt::setCopiesOnScroll()
177 // apparently mac specific
181 void FrameLoaderClientQt::detachedFromParent2()
186 void FrameLoaderClientQt::detachedFromParent3()
191 void FrameLoaderClientQt::detachedFromParent4()
195 void FrameLoaderClientQt::dispatchDidHandleOnloadEvents()
197 // don't need this one
201 void FrameLoaderClientQt::dispatchDidReceiveServerRedirectForProvisionalLoad()
207 void FrameLoaderClientQt::dispatchDidCancelClientRedirect()
213 void FrameLoaderClientQt::dispatchWillPerformClientRedirect(const KURL&,
221 void FrameLoaderClientQt::dispatchDidChangeLocationWithinPage()
227 void FrameLoaderClientQt::dispatchWillClose()
232 void FrameLoaderClientQt::dispatchDidStartProvisionalLoad()
235 emit m_webFrame->provisionalLoad();
239 void FrameLoaderClientQt::dispatchDidReceiveTitle(const String& title)
242 emit m_webFrame->urlChanged(m_webFrame->url());
243 emit titleChanged(title);
247 void FrameLoaderClientQt::dispatchDidCommitLoad()
249 if (m_frame->tree()->parent())
251 m_webFrame->page()->d->updateNavigationActions();
255 void FrameLoaderClientQt::dispatchDidFinishDocumentLoad()
257 if (m_frame->tree()->parent())
259 m_webFrame->page()->d->updateNavigationActions();
263 void FrameLoaderClientQt::dispatchDidFinishLoad()
266 emit m_webFrame->loadDone(true);
267 if (m_frame->tree()->parent())
269 m_webFrame->page()->d->updateNavigationActions();
273 void FrameLoaderClientQt::dispatchDidFirstLayout()
276 emit m_webFrame->initialLayoutComplete();
280 void FrameLoaderClientQt::dispatchShow()
286 void FrameLoaderClientQt::cancelPolicyCheck()
288 // qDebug() << "FrameLoaderClientQt::cancelPolicyCheck";
289 m_policyFunction = 0;
293 void FrameLoaderClientQt::dispatchWillSubmitForm(FramePolicyFunction function,
294 PassRefPtr<FormState>)
297 Q_ASSERT(!m_policyFunction);
298 // FIXME: This is surely too simple
299 callPolicyFunction(function, PolicyUse);
303 void FrameLoaderClientQt::dispatchDidLoadMainResource(DocumentLoader*)
308 void FrameLoaderClientQt::revertToProvisionalState(DocumentLoader*)
314 void FrameLoaderClientQt::postProgressStartedNotification()
316 if (m_webFrame && m_frame->page())
318 if (m_frame->tree()->parent())
320 m_webFrame->page()->d->updateNavigationActions();
323 void FrameLoaderClientQt::postProgressEstimateChangedNotification()
325 if (m_webFrame && m_frame->page())
326 emit loadProgressChanged(qRound(m_frame->page()->progress()->estimatedProgress() * 100));
329 void FrameLoaderClientQt::postProgressFinishedNotification()
331 if (m_webFrame && m_frame->page())
335 void FrameLoaderClientQt::setMainFrameDocumentReady(bool b)
337 // this is only interesting once we provide an external API for the DOM
341 void FrameLoaderClientQt::willChangeTitle(DocumentLoader*)
343 // no need for, dispatchDidReceiveTitle is the right callback
347 void FrameLoaderClientQt::didChangeTitle(DocumentLoader *)
349 // no need for, dispatchDidReceiveTitle is the right callback
353 void FrameLoaderClientQt::finishedLoading(DocumentLoader* loader)
356 FrameLoader *fl = loader->frameLoader();
357 fl->setEncoding(m_response.textEncodingName(), false);
363 bool FrameLoaderClientQt::canShowMIMEType(const String& MIMEType) const
365 if (MIMETypeRegistry::isSupportedImageMIMEType(MIMEType))
368 if (MIMETypeRegistry::isSupportedNonImageMIMEType(MIMEType))
374 bool FrameLoaderClientQt::representationExistsForURLScheme(const String& URLScheme) const
380 String FrameLoaderClientQt::generatedMIMETypeForURLScheme(const String& URLScheme) const
387 void FrameLoaderClientQt::frameLoadCompleted()
389 // Note: Can be called multiple times.
390 // Even if already complete, we might have set a previous item on a frame that
391 // didn't do any data loading on the past transaction. Make sure to clear these out.
392 m_frame->loader()->setPreviousHistoryItem(0);
396 void FrameLoaderClientQt::restoreViewState()
402 void FrameLoaderClientQt::provisionalLoadStarted()
404 // don't need to do anything here
408 void FrameLoaderClientQt::didFinishLoad()
414 void FrameLoaderClientQt::prepareForDataSourceReplacement()
416 m_frame->loader()->detachChildren();
419 void FrameLoaderClientQt::setTitle(const String&, const KURL&)
421 // no need for, dispatchDidReceiveTitle is the right callback
425 String FrameLoaderClientQt::userAgent(const KURL& url)
428 return m_webFrame->page()->userAgentFor(QUrl((QString)url.string()));
433 void FrameLoaderClientQt::dispatchDidReceiveIcon()
436 emit m_webFrame->iconLoaded();
440 void FrameLoaderClientQt::frameLoaderDestroyed()
449 bool FrameLoaderClientQt::canHandleRequest(const WebCore::ResourceRequest&) const
454 void FrameLoaderClientQt::windowObjectCleared()
457 emit m_webFrame->cleared();
460 void FrameLoaderClientQt::didPerformFirstNavigation() const
462 if (m_frame->tree()->parent())
464 m_webFrame->page()->d->updateNavigationActions();
467 void FrameLoaderClientQt::registerForIconNotification(bool)
472 void FrameLoaderClientQt::updateGlobalHistory(const WebCore::KURL& url)
474 QWebHistoryInterface *history = QWebHistoryInterface::defaultInterface();
476 history->addHistoryEntry(url.prettyURL());
479 bool FrameLoaderClientQt::shouldGoToHistoryItem(WebCore::HistoryItem *item) const
487 void FrameLoaderClientQt::saveViewStateToItem(WebCore::HistoryItem*)
492 bool FrameLoaderClientQt::canCachePage() const
494 // don't do any caching for now
498 void FrameLoaderClientQt::setMainDocumentError(WebCore::DocumentLoader* loader, const WebCore::ResourceError& error)
501 loader->frameLoader()->setEncoding(m_response.textEncodingName(), false);
506 void FrameLoaderClientQt::committedLoad(WebCore::DocumentLoader* loader, const char* data, int length)
510 FrameLoader *fl = loader->frameLoader();
512 fl->setEncoding(m_response.textEncodingName(), false);
515 fl->addData(data, length);
518 WebCore::ResourceError FrameLoaderClientQt::cancelledError(const WebCore::ResourceRequest& request)
520 return ResourceError("Error", -999, request.url().prettyURL(),
521 QCoreApplication::translate("QWebFrame", "Request cancelled", 0, QCoreApplication::UnicodeUTF8));
524 // copied from WebKit/Misc/WebKitErrors[Private].h
526 WebKitErrorCannotShowMIMEType = 100,
527 WebKitErrorCannotShowURL = 101,
528 WebKitErrorFrameLoadInterruptedByPolicyChange = 102,
529 WebKitErrorCannotUseRestrictedPort = 103,
530 WebKitErrorCannotFindPlugIn = 200,
531 WebKitErrorCannotLoadPlugIn = 201,
532 WebKitErrorJavaUnavailable = 202,
535 WebCore::ResourceError FrameLoaderClientQt::blockedError(const WebCore::ResourceRequest& request)
537 return ResourceError("Error", WebKitErrorCannotUseRestrictedPort, request.url().prettyURL(),
538 QCoreApplication::translate("QWebFrame", "Request blocked", 0, QCoreApplication::UnicodeUTF8));
542 WebCore::ResourceError FrameLoaderClientQt::cannotShowURLError(const WebCore::ResourceRequest& request)
544 return ResourceError("Error", WebKitErrorCannotShowURL, request.url().string(),
545 QCoreApplication::translate("QWebFrame", "Cannot show URL", 0, QCoreApplication::UnicodeUTF8));
548 WebCore::ResourceError FrameLoaderClientQt::interruptForPolicyChangeError(const WebCore::ResourceRequest& request)
550 return ResourceError("Error", WebKitErrorFrameLoadInterruptedByPolicyChange, request.url().string(),
551 QCoreApplication::translate("QWebFrame", "Frame load interruped by policy change", 0, QCoreApplication::UnicodeUTF8));
554 WebCore::ResourceError FrameLoaderClientQt::cannotShowMIMETypeError(const WebCore::ResourceResponse& response)
556 return ResourceError("Error", WebKitErrorCannotShowMIMEType, response.url().string(),
557 QCoreApplication::translate("QWebFrame", "Cannot show mimetype", 0, QCoreApplication::UnicodeUTF8));
560 WebCore::ResourceError FrameLoaderClientQt::fileDoesNotExistError(const WebCore::ResourceResponse& response)
562 return ResourceError("Error", -998 /* ### */, response.url().string(),
563 QCoreApplication::translate("QWebFrame", "File does not exist", 0, QCoreApplication::UnicodeUTF8));
566 bool FrameLoaderClientQt::shouldFallBack(const WebCore::ResourceError&)
572 WTF::PassRefPtr<WebCore::DocumentLoader> FrameLoaderClientQt::createDocumentLoader(const WebCore::ResourceRequest& request, const SubstituteData& substituteData)
574 RefPtr<DocumentLoader> loader = new DocumentLoader(request, substituteData);
575 return loader.release();
578 void FrameLoaderClientQt::download(WebCore::ResourceHandle* handle, const WebCore::ResourceRequest&, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&)
580 #if QT_VERSION >= 0x040400
581 QNetworkReplyHandler* handler = handle->getInternal()->m_job;
582 QNetworkReply* reply = handler->release();
584 QWebPage *page = m_webFrame->page();
585 if (page->receivers(SIGNAL(handleUnsupportedContent(QNetworkReply *))))
586 emit m_webFrame->page()->handleUnsupportedContent(reply);
593 void FrameLoaderClientQt::assignIdentifierToInitialRequest(unsigned long identifier, WebCore::DocumentLoader*, const WebCore::ResourceRequest&)
597 void FrameLoaderClientQt::dispatchWillSendRequest(WebCore::DocumentLoader*, unsigned long, WebCore::ResourceRequest& request, const WebCore::ResourceResponse& response)
599 // seems like the Mac code doesn't do anything here by default neither
600 //qDebug() << "FrameLoaderClientQt::dispatchWillSendRequest" << request.isNull() << request.url().string`();
603 void FrameLoaderClientQt::dispatchDidReceiveAuthenticationChallenge(DocumentLoader*, unsigned long, const AuthenticationChallenge&)
608 void FrameLoaderClientQt::dispatchDidCancelAuthenticationChallenge(DocumentLoader*, unsigned long, const AuthenticationChallenge&)
613 void FrameLoaderClientQt::dispatchDidReceiveResponse(WebCore::DocumentLoader*, unsigned long, const WebCore::ResourceResponse& response)
616 m_response = response;
618 //qDebug() << " got response from" << response.url().string();
621 void FrameLoaderClientQt::dispatchDidReceiveContentLength(WebCore::DocumentLoader*, unsigned long, int)
625 void FrameLoaderClientQt::dispatchDidFinishLoading(WebCore::DocumentLoader* loader, unsigned long)
629 void FrameLoaderClientQt::dispatchDidFailLoading(WebCore::DocumentLoader* loader, unsigned long, const WebCore::ResourceError&)
632 FrameLoader *fl = loader->frameLoader();
633 fl->setEncoding(m_response.textEncodingName(), false);
638 bool FrameLoaderClientQt::dispatchDidLoadResourceFromMemoryCache(WebCore::DocumentLoader*, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, int)
644 void FrameLoaderClientQt::dispatchDidFailProvisionalLoad(const WebCore::ResourceError&)
647 emit m_webFrame->loadDone(false);
650 void FrameLoaderClientQt::dispatchDidFailLoad(const WebCore::ResourceError&)
653 emit m_webFrame->loadDone(false);
656 WebCore::Frame* FrameLoaderClientQt::dispatchCreatePage()
660 QWebPage *newPage = m_webFrame->page()->createWindow();
663 return newPage->mainFrame()->d->frame;
666 void FrameLoaderClientQt::dispatchDecidePolicyForMIMEType(FramePolicyFunction function, const WebCore::String& MIMEType, const WebCore::ResourceRequest&)
668 // we need to call directly here
669 Q_ASSERT(!m_policyFunction);
670 m_policyFunction = function;
671 if (canShowMIMEType(MIMEType))
672 slotCallPolicyFunction(PolicyUse);
674 slotCallPolicyFunction(PolicyDownload);
677 void FrameLoaderClientQt::dispatchDecidePolicyForNewWindowAction(FramePolicyFunction function, const WebCore::NavigationAction&, const WebCore::ResourceRequest&, const WebCore::String&)
679 Q_ASSERT(!m_policyFunction);
680 m_policyFunction = function;
681 slotCallPolicyFunction(PolicyUse);
684 void FrameLoaderClientQt::dispatchDecidePolicyForNavigationAction(FramePolicyFunction function, const WebCore::NavigationAction& action, const WebCore::ResourceRequest& request)
686 Q_ASSERT(!m_policyFunction);
687 m_policyFunction = function;
689 #if QT_VERSION < 0x040400
690 QWebNetworkRequest r(request);
692 QNetworkRequest r(request.toNetworkRequest());
694 QWebPage *page = m_webFrame->page();
696 if (page->d->navigationRequested(m_webFrame, r, QWebPage::NavigationType(action.type())) ==
697 QWebPage::IgnoreNavigationRequest) {
698 slotCallPolicyFunction(PolicyIgnore);
702 slotCallPolicyFunction(PolicyUse);
706 void FrameLoaderClientQt::dispatchUnableToImplementPolicy(const WebCore::ResourceError&)
711 void FrameLoaderClientQt::startDownload(const WebCore::ResourceRequest& request)
713 #if QT_VERSION >= 0x040400
714 QWebPage *page = m_webFrame->page();
715 emit m_webFrame->page()->download(request.toNetworkRequest());
719 PassRefPtr<Frame> FrameLoaderClientQt::createFrame(const KURL& url, const String& name, HTMLFrameOwnerElement* ownerElement,
720 const String& referrer, bool allowsScrolling, int marginWidth, int marginHeight)
722 QWebFrameData frameData;
724 frameData.name = name;
725 frameData.ownerElement = ownerElement;
726 frameData.referrer = referrer;
727 frameData.allowsScrolling = allowsScrolling;
728 frameData.marginWidth = marginWidth;
729 frameData.marginHeight = marginHeight;
731 QWebFrame* webFrame = new QWebFrame(m_webFrame, &frameData);
732 emit m_webFrame->page()->frameCreated(webFrame);
734 RefPtr<Frame> childFrame = adoptRef(webFrame->d->frame);
736 // FIXME: All of the below should probably be moved over into WebCore
737 childFrame->tree()->setName(name);
738 m_frame->tree()->appendChild(childFrame);
739 // ### set override encoding if we have one
741 FrameLoadType loadType = m_frame->loader()->loadType();
742 FrameLoadType childLoadType = FrameLoadTypeRedirectWithLockedHistory;
744 childFrame->loader()->load(frameData.url, frameData.referrer, childLoadType,
747 // The frame's onload handler may have removed it from the document.
748 if (!childFrame->tree()->parent())
751 return childFrame.release();
754 ObjectContentType FrameLoaderClientQt::objectContentType(const KURL& url, const String& _mimeType)
756 // qDebug()<<" ++++++++++++++++ url is "<<url.prettyURL()<<", mime = "<<_mimeType;
757 if (_mimeType == "application/x-qt-plugin" || _mimeType == "application/x-qt-styled-widget")
758 return ObjectContentOtherPlugin;
761 return ObjectContentNone;
763 String mimeType = _mimeType;
764 if (!mimeType.length()) {
765 QFileInfo fi(url.path());
766 mimeType = MIMETypeRegistry::getMIMETypeForExtension(fi.suffix());
769 if (!mimeType.length())
770 return ObjectContentFrame;
772 if (MIMETypeRegistry::isSupportedImageMIMEType(mimeType))
773 return ObjectContentImage;
775 if (m_frame->page() && m_frame->page()->pluginData()->supportsMimeType(mimeType))
776 return ObjectContentOtherPlugin;
778 if (MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType))
779 return ObjectContentFrame;
781 if (url.protocol() == "about")
782 return ObjectContentFrame;
784 return ObjectContentNone;
787 static const CSSPropertyID qstyleSheetProperties[] = {
789 CSSPropertyFontFamily,
791 CSSPropertyFontStyle,
792 CSSPropertyFontWeight
795 const unsigned numqStyleSheetProperties = sizeof(qstyleSheetProperties) / sizeof(qstyleSheetProperties[0]);
797 Widget* FrameLoaderClientQt::createPlugin(const IntSize&, Element* element, const KURL& url, const Vector<String>& paramNames,
798 const Vector<String>& paramValues, const String& mimeType, bool loadManually)
800 // qDebug()<<"------ Creating plugin in FrameLoaderClientQt::createPlugin for "<<url.prettyURL() << mimeType;
801 // qDebug()<<"------\t url = "<<url.prettyURL();
804 for (int i = 0; i < paramNames.size(); ++i)
805 params.append(paramNames[i]);
806 for (int i = 0; i < paramValues.size(); ++i)
807 values.append(paramValues[i]);
809 QString urlStr(url.string());
814 if (mimeType == "application/x-qt-plugin" || mimeType == "application/x-qt-styled-widget") {
815 object = m_webFrame->page()->createPlugin(element->getAttribute("classid"), qurl, params, values);
816 QWidget *widget = qobject_cast<QWidget *>(object);
817 if (widget && mimeType == "application/x-qt-styled-widget") {
818 CSSComputedStyleDeclaration cssDecl(element);
820 QString styleSheet = element->getAttribute("style");
821 if (!styleSheet.isEmpty())
822 styleSheet += QLatin1Char(';');
824 for (int i = 0; i < numqStyleSheetProperties; ++i) {
825 CSSPropertyID property = qstyleSheetProperties[i];
827 styleSheet += ::getPropertyName(property);
828 styleSheet += QLatin1Char(':');
829 styleSheet += cssDecl.getPropertyValue(property);
830 styleSheet += QLatin1Char(';');
833 widget->setStyleSheet(styleSheet);
837 #if QT_VERSION >= 0x040400
839 QWebPluginFactory* factory = m_webFrame->page()->pluginFactory();
841 object = factory->create(mimeType, qurl, params, values);
846 QWidget *widget = qobject_cast<QWidget *>(object);
847 QWidget *view = m_webFrame->page()->view();
848 if (widget && view) {
849 widget->setParent(view);
850 Widget* w= new Widget();
851 w->setNativeWidget(widget);
854 // FIXME: make things work for widgetless plugins as well
861 void FrameLoaderClientQt::redirectDataToPlugin(Widget* pluginWidget)
867 Widget* FrameLoaderClientQt::createJavaAppletWidget(const IntSize&, Element*, const KURL& baseURL,
868 const Vector<String>& paramNames, const Vector<String>& paramValues)
874 String FrameLoaderClientQt::overrideMediaType() const
879 QString FrameLoaderClientQt::chooseFile(const QString& oldFile)
881 return webFrame()->page()->chooseFile(webFrame(), oldFile);
887 #include "moc_FrameLoaderClientQt.cpp"