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 "RenderPart.h"
43 #include "ResourceRequest.h"
44 #include "HistoryItem.h"
45 #include "HTMLFormElement.h"
46 #include "NotImplemented.h"
47 #include "QNetworkReplyHandler.h"
48 #include "ResourceHandleInternal.h"
49 #include "ResourceHandle.h"
52 #include "qwebframe.h"
53 #include "qwebframe_p.h"
54 #include "qwebhistoryinterface.h"
55 #include "qwebpluginfactory.h"
57 #include <qfileinfo.h>
59 #include <QCoreApplication>
61 #if QT_VERSION >= 0x040400
62 #include <QNetworkRequest>
63 #include <QNetworkReply>
65 #include "qwebnetworkinterface_p.h"
68 static bool dumpFrameLoaderCallbacks = false;
70 void QWEBKIT_EXPORT qt_dump_frame_loader(bool b)
72 dumpFrameLoaderCallbacks = b;
75 // Compare with WebKitTools/DumpRenderTree/mac/FrameLoadDelegate.mm
76 static QString drtDescriptionSuitableForTestResult(WebCore::Frame* _frame)
78 QWebFrame* frame = QWebFramePrivate::kit(_frame);
79 QString name = frame->name();
81 bool isMainFrame = frame == frame->page()->mainFrame();
84 return QString::fromLatin1("main frame \"%1\"").arg(name);
85 return QLatin1String("main frame");
88 return QString::fromLatin1("frame \"%1\"").arg(name);
89 return QLatin1String("frame (anonymous)");
93 static QString drtDescriptionSuitableForTestResult(const WebCore::KURL& _url)
96 return url.toString();
103 FrameLoaderClientQt::FrameLoaderClientQt()
107 , m_policyFunction(0)
109 connect(this, SIGNAL(sigCallPolicyFunction(int)), this, SLOT(slotCallPolicyFunction(int)), Qt::QueuedConnection);
113 FrameLoaderClientQt::~FrameLoaderClientQt()
117 void FrameLoaderClientQt::setFrame(QWebFrame* webFrame, Frame* frame)
119 m_webFrame = webFrame;
121 if (!m_webFrame || !m_webFrame->page()) {
122 qWarning("FrameLoaderClientQt::setFrame frame without Page!");
126 connect(this, SIGNAL(loadStarted()),
127 m_webFrame, SIGNAL(loadStarted()));
128 connect(this, SIGNAL(loadProgressChanged(int)),
129 m_webFrame->page(), SIGNAL(loadProgressChanged(int)));
130 connect(this, SIGNAL(loadFinished()),
131 m_webFrame, SIGNAL(loadFinished()));
132 connect(this, SIGNAL(titleChanged(const QString&)),
133 m_webFrame, SIGNAL(titleChanged(const QString&)));
136 QWebFrame* FrameLoaderClientQt::webFrame() const
141 void FrameLoaderClientQt::callPolicyFunction(FramePolicyFunction function, PolicyAction action)
143 ASSERT(!m_policyFunction);
146 m_policyFunction = function;
147 emit sigCallPolicyFunction(action);
150 void FrameLoaderClientQt::slotCallPolicyFunction(int action)
152 if (!m_frame || !m_policyFunction)
154 FramePolicyFunction function = m_policyFunction;
155 m_policyFunction = 0;
156 (m_frame->loader()->*function)(WebCore::PolicyAction(action));
159 bool FrameLoaderClientQt::hasWebView() const
166 bool FrameLoaderClientQt::hasFrameView() const
172 void FrameLoaderClientQt::savePlatformDataToCachedPage(CachedPage*)
177 void FrameLoaderClientQt::transitionToCommittedFromCachedPage(CachedPage*)
181 void FrameLoaderClientQt::transitionToCommittedForNewPage()
186 Page* page = m_frame->page();
189 bool isMainFrame = m_frame == page->mainFrame();
193 FrameView* frameView;
195 frameView = new FrameView(m_frame, m_webFrame->page()->viewportSize());
197 frameView = new FrameView(m_frame);
199 if (!m_webFrame->d->allowsScrolling)
200 frameView->setScrollbarsMode(ScrollbarAlwaysOff);
201 if (m_webFrame->d->marginWidth != -1)
202 frameView->setMarginWidth(m_webFrame->d->marginWidth);
203 if (m_webFrame->d->marginHeight != -1)
204 frameView->setMarginHeight(m_webFrame->d->marginHeight);
205 if (m_webFrame->d->horizontalScrollBarPolicy != Qt::ScrollBarAsNeeded)
206 frameView->setHScrollbarMode((ScrollbarMode)m_webFrame->d->horizontalScrollBarPolicy);
207 if (m_webFrame->d->verticalScrollBarPolicy != Qt::ScrollBarAsNeeded)
208 frameView->setVScrollbarMode((ScrollbarMode)m_webFrame->d->verticalScrollBarPolicy);
210 m_frame->setView(frameView);
211 // FrameViews are created with a ref count of 1. Release this ref since we've assigned it to frame.
214 if (m_frame->ownerRenderer())
215 m_frame->ownerRenderer()->setWidget(frameView);
219 void FrameLoaderClientQt::makeRepresentation(DocumentLoader*)
221 // don't need this for now I think.
225 void FrameLoaderClientQt::forceLayout()
227 m_frame->forceLayout(true);
231 void FrameLoaderClientQt::forceLayoutForNonHTML()
236 void FrameLoaderClientQt::setCopiesOnScroll()
238 // apparently mac specific
242 void FrameLoaderClientQt::detachedFromParent2()
247 void FrameLoaderClientQt::detachedFromParent3()
252 void FrameLoaderClientQt::detachedFromParent4()
256 void FrameLoaderClientQt::dispatchDidHandleOnloadEvents()
258 // don't need this one
259 if (dumpFrameLoaderCallbacks)
260 printf("%s - didHandleOnloadEventsForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
265 void FrameLoaderClientQt::dispatchDidReceiveServerRedirectForProvisionalLoad()
267 if (dumpFrameLoaderCallbacks)
268 printf("%s - didReceiveServerRedirectForProvisionalLoadForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
274 void FrameLoaderClientQt::dispatchDidCancelClientRedirect()
276 if (dumpFrameLoaderCallbacks)
277 printf("%s - didCancelClientRedirectForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
283 void FrameLoaderClientQt::dispatchWillPerformClientRedirect(const KURL& url,
287 if (dumpFrameLoaderCallbacks)
288 printf("%s - willPerformClientRedirectToURL: %s \n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)), qPrintable(drtDescriptionSuitableForTestResult(url)));
294 void FrameLoaderClientQt::dispatchDidChangeLocationWithinPage()
296 if (dumpFrameLoaderCallbacks)
297 printf("%s - didChangeLocationWithinPageForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
303 void FrameLoaderClientQt::dispatchWillClose()
305 if (dumpFrameLoaderCallbacks)
306 printf("%s - willCloseFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
310 void FrameLoaderClientQt::dispatchDidStartProvisionalLoad()
312 if (dumpFrameLoaderCallbacks)
313 printf("%s - didStartProvisionalLoadForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
316 emit m_webFrame->provisionalLoad();
320 void FrameLoaderClientQt::dispatchDidReceiveTitle(const String& title)
322 if (dumpFrameLoaderCallbacks)
323 printf("%s - didReceiveTitle: %s\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)), qPrintable(QString(title)));
331 emit m_webFrame->urlChanged(m_webFrame->url());
332 emit titleChanged(title);
336 void FrameLoaderClientQt::dispatchDidCommitLoad()
338 if (dumpFrameLoaderCallbacks)
339 printf("%s - didCommitLoadForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
341 if (m_frame->tree()->parent() || !m_webFrame)
344 m_webFrame->page()->d->updateNavigationActions();
348 void FrameLoaderClientQt::dispatchDidFinishDocumentLoad()
350 if (dumpFrameLoaderCallbacks)
351 printf("%s - didFinishDocumentLoadForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
353 if (m_frame->tree()->parent() || !m_webFrame)
356 m_webFrame->page()->d->updateNavigationActions();
360 void FrameLoaderClientQt::dispatchDidFinishLoad()
362 if (dumpFrameLoaderCallbacks)
363 printf("%s - didFinishLoadForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
366 emit m_webFrame->loadDone(true);
367 if (m_frame->tree()->parent() || !m_webFrame)
369 m_webFrame->page()->d->updateNavigationActions();
373 void FrameLoaderClientQt::dispatchDidFirstLayout()
376 emit m_webFrame->initialLayoutComplete();
380 void FrameLoaderClientQt::dispatchShow()
386 void FrameLoaderClientQt::cancelPolicyCheck()
388 // qDebug() << "FrameLoaderClientQt::cancelPolicyCheck";
389 m_policyFunction = 0;
393 void FrameLoaderClientQt::dispatchWillSubmitForm(FramePolicyFunction function,
394 PassRefPtr<FormState>)
397 Q_ASSERT(!m_policyFunction);
398 // FIXME: This is surely too simple
399 callPolicyFunction(function, PolicyUse);
403 void FrameLoaderClientQt::dispatchDidLoadMainResource(DocumentLoader*)
408 void FrameLoaderClientQt::revertToProvisionalState(DocumentLoader*)
414 void FrameLoaderClientQt::postProgressStartedNotification()
416 if (m_webFrame && m_frame->page())
418 if (m_frame->tree()->parent() || !m_webFrame)
420 m_webFrame->page()->d->updateNavigationActions();
423 void FrameLoaderClientQt::postProgressEstimateChangedNotification()
425 if (m_webFrame && m_frame->page())
426 emit loadProgressChanged(qRound(m_frame->page()->progress()->estimatedProgress() * 100));
429 void FrameLoaderClientQt::postProgressFinishedNotification()
431 if (m_webFrame && m_frame->page())
435 void FrameLoaderClientQt::setMainFrameDocumentReady(bool b)
437 // this is only interesting once we provide an external API for the DOM
441 void FrameLoaderClientQt::willChangeTitle(DocumentLoader*)
443 // no need for, dispatchDidReceiveTitle is the right callback
447 void FrameLoaderClientQt::didChangeTitle(DocumentLoader *)
449 // no need for, dispatchDidReceiveTitle is the right callback
453 void FrameLoaderClientQt::finishedLoading(DocumentLoader* loader)
456 FrameLoader *fl = loader->frameLoader();
457 fl->setEncoding(m_response.textEncodingName(), false);
463 bool FrameLoaderClientQt::canShowMIMEType(const String& MIMEType) const
465 if (MIMETypeRegistry::isSupportedImageMIMEType(MIMEType))
468 if (MIMETypeRegistry::isSupportedNonImageMIMEType(MIMEType))
474 bool FrameLoaderClientQt::representationExistsForURLScheme(const String& URLScheme) const
480 String FrameLoaderClientQt::generatedMIMETypeForURLScheme(const String& URLScheme) const
487 void FrameLoaderClientQt::frameLoadCompleted()
489 // Note: Can be called multiple times.
490 // Even if already complete, we might have set a previous item on a frame that
491 // didn't do any data loading on the past transaction. Make sure to clear these out.
492 m_frame->loader()->setPreviousHistoryItem(0);
496 void FrameLoaderClientQt::restoreViewState()
502 void FrameLoaderClientQt::provisionalLoadStarted()
504 // don't need to do anything here
508 void FrameLoaderClientQt::didFinishLoad()
514 void FrameLoaderClientQt::prepareForDataSourceReplacement()
516 m_frame->loader()->detachChildren();
519 void FrameLoaderClientQt::setTitle(const String&, const KURL&)
521 // no need for, dispatchDidReceiveTitle is the right callback
525 String FrameLoaderClientQt::userAgent(const KURL& url)
528 return m_webFrame->page()->userAgentFor(QUrl((QString)url.string()));
533 void FrameLoaderClientQt::dispatchDidReceiveIcon()
535 if (dumpFrameLoaderCallbacks)
536 printf("%s - didReceiveIconForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
539 emit m_webFrame->iconLoaded();
543 void FrameLoaderClientQt::frameLoaderDestroyed()
552 bool FrameLoaderClientQt::canHandleRequest(const WebCore::ResourceRequest&) const
557 void FrameLoaderClientQt::windowObjectCleared()
559 if (dumpFrameLoaderCallbacks)
560 printf("%s - didClearWindowObjectForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
563 emit m_webFrame->cleared();
566 void FrameLoaderClientQt::didPerformFirstNavigation() const
568 if (m_frame->tree()->parent() || !m_webFrame)
570 m_webFrame->page()->d->updateNavigationActions();
573 void FrameLoaderClientQt::registerForIconNotification(bool)
578 void FrameLoaderClientQt::updateGlobalHistory(const WebCore::KURL& url)
580 QWebHistoryInterface *history = QWebHistoryInterface::defaultInterface();
582 history->addHistoryEntry(url.prettyURL());
585 bool FrameLoaderClientQt::shouldGoToHistoryItem(WebCore::HistoryItem *item) const
590 void FrameLoaderClientQt::saveViewStateToItem(WebCore::HistoryItem*)
594 bool FrameLoaderClientQt::canCachePage() const
599 void FrameLoaderClientQt::setMainDocumentError(WebCore::DocumentLoader* loader, const WebCore::ResourceError& error)
602 loader->frameLoader()->setEncoding(m_response.textEncodingName(), false);
607 void FrameLoaderClientQt::committedLoad(WebCore::DocumentLoader* loader, const char* data, int length)
611 FrameLoader *fl = loader->frameLoader();
613 fl->setEncoding(m_response.textEncodingName(), false);
616 fl->addData(data, length);
619 WebCore::ResourceError FrameLoaderClientQt::cancelledError(const WebCore::ResourceRequest& request)
621 return ResourceError("Error", -999, request.url().prettyURL(),
622 QCoreApplication::translate("QWebFrame", "Request cancelled", 0, QCoreApplication::UnicodeUTF8));
625 // copied from WebKit/Misc/WebKitErrors[Private].h
627 WebKitErrorCannotShowMIMEType = 100,
628 WebKitErrorCannotShowURL = 101,
629 WebKitErrorFrameLoadInterruptedByPolicyChange = 102,
630 WebKitErrorCannotUseRestrictedPort = 103,
631 WebKitErrorCannotFindPlugIn = 200,
632 WebKitErrorCannotLoadPlugIn = 201,
633 WebKitErrorJavaUnavailable = 202,
636 WebCore::ResourceError FrameLoaderClientQt::blockedError(const WebCore::ResourceRequest& request)
638 return ResourceError("Error", WebKitErrorCannotUseRestrictedPort, request.url().prettyURL(),
639 QCoreApplication::translate("QWebFrame", "Request blocked", 0, QCoreApplication::UnicodeUTF8));
643 WebCore::ResourceError FrameLoaderClientQt::cannotShowURLError(const WebCore::ResourceRequest& request)
645 return ResourceError("Error", WebKitErrorCannotShowURL, request.url().string(),
646 QCoreApplication::translate("QWebFrame", "Cannot show URL", 0, QCoreApplication::UnicodeUTF8));
649 WebCore::ResourceError FrameLoaderClientQt::interruptForPolicyChangeError(const WebCore::ResourceRequest& request)
651 return ResourceError("Error", WebKitErrorFrameLoadInterruptedByPolicyChange, request.url().string(),
652 QCoreApplication::translate("QWebFrame", "Frame load interruped by policy change", 0, QCoreApplication::UnicodeUTF8));
655 WebCore::ResourceError FrameLoaderClientQt::cannotShowMIMETypeError(const WebCore::ResourceResponse& response)
657 return ResourceError("Error", WebKitErrorCannotShowMIMEType, response.url().string(),
658 QCoreApplication::translate("QWebFrame", "Cannot show mimetype", 0, QCoreApplication::UnicodeUTF8));
661 WebCore::ResourceError FrameLoaderClientQt::fileDoesNotExistError(const WebCore::ResourceResponse& response)
663 return ResourceError("Error", -998 /* ### */, response.url().string(),
664 QCoreApplication::translate("QWebFrame", "File does not exist", 0, QCoreApplication::UnicodeUTF8));
667 bool FrameLoaderClientQt::shouldFallBack(const WebCore::ResourceError&)
673 WTF::PassRefPtr<WebCore::DocumentLoader> FrameLoaderClientQt::createDocumentLoader(const WebCore::ResourceRequest& request, const SubstituteData& substituteData)
675 RefPtr<DocumentLoader> loader = new DocumentLoader(request, substituteData);
676 return loader.release();
679 void FrameLoaderClientQt::download(WebCore::ResourceHandle* handle, const WebCore::ResourceRequest&, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&)
681 #if QT_VERSION >= 0x040400
685 QNetworkReplyHandler* handler = handle->getInternal()->m_job;
686 QNetworkReply* reply = handler->release();
688 QWebPage *page = m_webFrame->page();
689 if (page->receivers(SIGNAL(handleUnsupportedContent(QNetworkReply *))))
690 emit m_webFrame->page()->handleUnsupportedContent(reply);
697 void FrameLoaderClientQt::assignIdentifierToInitialRequest(unsigned long identifier, WebCore::DocumentLoader*, const WebCore::ResourceRequest&)
701 void FrameLoaderClientQt::dispatchWillSendRequest(WebCore::DocumentLoader*, unsigned long, WebCore::ResourceRequest& request, const WebCore::ResourceResponse& response)
703 // seems like the Mac code doesn't do anything here by default neither
704 //qDebug() << "FrameLoaderClientQt::dispatchWillSendRequest" << request.isNull() << request.url().string`();
707 void FrameLoaderClientQt::dispatchDidReceiveAuthenticationChallenge(DocumentLoader*, unsigned long, const AuthenticationChallenge&)
712 void FrameLoaderClientQt::dispatchDidCancelAuthenticationChallenge(DocumentLoader*, unsigned long, const AuthenticationChallenge&)
717 void FrameLoaderClientQt::dispatchDidReceiveResponse(WebCore::DocumentLoader*, unsigned long, const WebCore::ResourceResponse& response)
720 m_response = response;
722 //qDebug() << " got response from" << response.url().string();
725 void FrameLoaderClientQt::dispatchDidReceiveContentLength(WebCore::DocumentLoader*, unsigned long, int)
729 void FrameLoaderClientQt::dispatchDidFinishLoading(WebCore::DocumentLoader* loader, unsigned long)
733 void FrameLoaderClientQt::dispatchDidFailLoading(WebCore::DocumentLoader* loader, unsigned long, const WebCore::ResourceError&)
736 FrameLoader *fl = loader->frameLoader();
737 fl->setEncoding(m_response.textEncodingName(), false);
742 bool FrameLoaderClientQt::dispatchDidLoadResourceFromMemoryCache(WebCore::DocumentLoader*, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, int)
748 void FrameLoaderClientQt::dispatchDidFailProvisionalLoad(const WebCore::ResourceError&)
750 if (dumpFrameLoaderCallbacks)
751 printf("%s - didFailProvisionalLoadWithError\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
754 emit m_webFrame->loadDone(false);
757 void FrameLoaderClientQt::dispatchDidFailLoad(const WebCore::ResourceError&)
759 if (dumpFrameLoaderCallbacks)
760 printf("%s - didFailLoadWithError\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
763 emit m_webFrame->loadDone(false);
766 WebCore::Frame* FrameLoaderClientQt::dispatchCreatePage()
770 QWebPage *newPage = m_webFrame->page()->createWindow();
773 return newPage->mainFrame()->d->frame;
776 void FrameLoaderClientQt::dispatchDecidePolicyForMIMEType(FramePolicyFunction function, const WebCore::String& MIMEType, const WebCore::ResourceRequest&)
778 // we need to call directly here
779 Q_ASSERT(!m_policyFunction);
780 m_policyFunction = function;
781 if (canShowMIMEType(MIMEType))
782 slotCallPolicyFunction(PolicyUse);
784 slotCallPolicyFunction(PolicyDownload);
787 void FrameLoaderClientQt::dispatchDecidePolicyForNewWindowAction(FramePolicyFunction function, const WebCore::NavigationAction&, const WebCore::ResourceRequest&, const WebCore::String&)
789 Q_ASSERT(!m_policyFunction);
790 m_policyFunction = function;
791 slotCallPolicyFunction(PolicyUse);
794 void FrameLoaderClientQt::dispatchDecidePolicyForNavigationAction(FramePolicyFunction function, const WebCore::NavigationAction& action, const WebCore::ResourceRequest& request)
796 Q_ASSERT(!m_policyFunction);
797 m_policyFunction = function;
799 #if QT_VERSION < 0x040400
800 QWebNetworkRequest r(request);
802 QNetworkRequest r(request.toNetworkRequest());
804 QWebPage *page = m_webFrame->page();
806 if (page->d->navigationRequested(m_webFrame, r, QWebPage::NavigationType(action.type())) ==
807 QWebPage::IgnoreNavigationRequest) {
808 slotCallPolicyFunction(PolicyIgnore);
812 slotCallPolicyFunction(PolicyUse);
816 void FrameLoaderClientQt::dispatchUnableToImplementPolicy(const WebCore::ResourceError&)
821 void FrameLoaderClientQt::startDownload(const WebCore::ResourceRequest& request)
823 #if QT_VERSION >= 0x040400
827 QWebPage *page = m_webFrame->page();
828 emit m_webFrame->page()->download(request.toNetworkRequest());
832 PassRefPtr<Frame> FrameLoaderClientQt::createFrame(const KURL& url, const String& name, HTMLFrameOwnerElement* ownerElement,
833 const String& referrer, bool allowsScrolling, int marginWidth, int marginHeight)
838 QWebFrameData frameData;
840 frameData.name = name;
841 frameData.ownerElement = ownerElement;
842 frameData.referrer = referrer;
843 frameData.allowsScrolling = allowsScrolling;
844 frameData.marginWidth = marginWidth;
845 frameData.marginHeight = marginHeight;
847 QWebFrame* webFrame = new QWebFrame(m_webFrame, &frameData);
848 emit m_webFrame->page()->frameCreated(webFrame);
850 RefPtr<Frame> childFrame = adoptRef(webFrame->d->frame);
852 // FIXME: All of the below should probably be moved over into WebCore
853 childFrame->tree()->setName(name);
854 m_frame->tree()->appendChild(childFrame);
855 // ### set override encoding if we have one
857 FrameLoadType loadType = m_frame->loader()->loadType();
858 FrameLoadType childLoadType = FrameLoadTypeRedirectWithLockedHistory;
860 childFrame->loader()->load(frameData.url, frameData.referrer, childLoadType,
863 // The frame's onload handler may have removed it from the document.
864 if (!childFrame->tree()->parent())
867 return childFrame.release();
870 ObjectContentType FrameLoaderClientQt::objectContentType(const KURL& url, const String& _mimeType)
872 // qDebug()<<" ++++++++++++++++ url is "<<url.prettyURL()<<", mime = "<<_mimeType;
873 if (_mimeType == "application/x-qt-plugin" || _mimeType == "application/x-qt-styled-widget")
874 return ObjectContentOtherPlugin;
877 return ObjectContentNone;
879 String mimeType = _mimeType;
880 if (!mimeType.length()) {
881 QFileInfo fi(url.path());
882 mimeType = MIMETypeRegistry::getMIMETypeForExtension(fi.suffix());
885 if (!mimeType.length())
886 return ObjectContentFrame;
888 if (MIMETypeRegistry::isSupportedImageMIMEType(mimeType))
889 return ObjectContentImage;
891 if (m_frame->page() && m_frame->page()->pluginData()->supportsMimeType(mimeType))
892 return ObjectContentOtherPlugin;
894 if (MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType))
895 return ObjectContentFrame;
897 if (url.protocol() == "about")
898 return ObjectContentFrame;
900 return ObjectContentNone;
903 static const CSSPropertyID qstyleSheetProperties[] = {
905 CSSPropertyFontFamily,
907 CSSPropertyFontStyle,
908 CSSPropertyFontWeight
911 const unsigned numqStyleSheetProperties = sizeof(qstyleSheetProperties) / sizeof(qstyleSheetProperties[0]);
913 Widget* FrameLoaderClientQt::createPlugin(const IntSize&, Element* element, const KURL& url, const Vector<String>& paramNames,
914 const Vector<String>& paramValues, const String& mimeType, bool loadManually)
916 // qDebug()<<"------ Creating plugin in FrameLoaderClientQt::createPlugin for "<<url.prettyURL() << mimeType;
917 // qDebug()<<"------\t url = "<<url.prettyURL();
924 for (int i = 0; i < paramNames.size(); ++i)
925 params.append(paramNames[i]);
926 for (int i = 0; i < paramValues.size(); ++i)
927 values.append(paramValues[i]);
929 QString urlStr(url.string());
934 if (mimeType == "application/x-qt-plugin" || mimeType == "application/x-qt-styled-widget") {
935 object = m_webFrame->page()->createPlugin(element->getAttribute("classid"), qurl, params, values);
936 QWidget *widget = qobject_cast<QWidget *>(object);
937 if (widget && mimeType == "application/x-qt-styled-widget") {
938 CSSComputedStyleDeclaration cssDecl(element);
940 QString styleSheet = element->getAttribute("style");
941 if (!styleSheet.isEmpty())
942 styleSheet += QLatin1Char(';');
944 for (int i = 0; i < numqStyleSheetProperties; ++i) {
945 CSSPropertyID property = qstyleSheetProperties[i];
947 styleSheet += ::getPropertyName(property);
948 styleSheet += QLatin1Char(':');
949 styleSheet += cssDecl.getPropertyValue(property);
950 styleSheet += QLatin1Char(';');
953 widget->setStyleSheet(styleSheet);
957 #if QT_VERSION >= 0x040400
959 QWebPluginFactory* factory = m_webFrame->page()->pluginFactory();
961 object = factory->create(mimeType, qurl, params, values);
966 QWidget *widget = qobject_cast<QWidget *>(object);
967 QWidget *view = m_webFrame->page()->view();
968 if (widget && view) {
969 widget->setParent(view);
970 Widget* w= new Widget();
971 w->setNativeWidget(widget);
974 // FIXME: make things work for widgetless plugins as well
981 void FrameLoaderClientQt::redirectDataToPlugin(Widget* pluginWidget)
987 Widget* FrameLoaderClientQt::createJavaAppletWidget(const IntSize&, Element*, const KURL& baseURL,
988 const Vector<String>& paramNames, const Vector<String>& paramValues)
994 String FrameLoaderClientQt::overrideMediaType() const
999 QString FrameLoaderClientQt::chooseFile(const QString& oldFile)
1001 return webFrame()->page()->chooseFile(webFrame(), oldFile);
1007 #include "moc_FrameLoaderClientQt.cpp"