1 /*
2 * Copyright (C) 2006 Zack Rusin <zack@kde.org>
3 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
4 * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
5 * Copyright (C) 2008 Collabora Ltd. All rights reserved.
6 * Coypright (C) 2008 Holger Hans Peter Freyther
7 * Coypright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in>
8 *
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 *
20 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
21 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
28 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33 #include "config.h"
34 #include "CSSComputedStyleDeclaration.h"
35 #include "CSSPropertyNames.h"
36 #include "FormState.h"
37 #include "FrameLoaderClientQt.h"
38 #include "FrameTree.h"
39 #include "FrameView.h"
40 #include "DocumentLoader.h"
41 #include "MIMETypeRegistry.h"
42 #include "ResourceResponse.h"
43 #include "Page.h"
44 #include "PluginData.h"
45 #include "PluginDatabase.h"
46 #include "ProgressTracker.h"
47 #include "RenderPart.h"
48 #include "ResourceRequest.h"
49 #include "HistoryItem.h"
50 #include "HTMLAppletElement.h"
51 #include "HTMLFormElement.h"
52 #include "HTMLPlugInElement.h"
53 #include "NotImplemented.h"
54 #include "QNetworkReplyHandler.h"
55 #include "ResourceHandleInternal.h"
56 #include "ResourceHandle.h"
57 #include "ScriptController.h"
58 #include "ScriptString.h"
59 #include "Settings.h"
60 #include "QWebPageClient.h"
61
62 #include "qwebpage.h"
63 #include "qwebpage_p.h"
64 #include "qwebframe.h"
65 #include "qwebframe_p.h"
66 #include "qwebhistoryinterface.h"
67 #include "qwebpluginfactory.h"
68
69 #include <qfileinfo.h>
70
71 #include <QCoreApplication>
72 #include <QDebug>
73 #include <QGraphicsScene>
74 #include <QGraphicsWidget>
75 #include <QNetworkRequest>
76 #include <QNetworkReply>
77 #include "qwebhistory_p.h"
78
79 static bool dumpFrameLoaderCallbacks = false;
80 static bool dumpResourceLoadCallbacks = false;
81
82 static QMap<unsigned long, QString> dumpAssignedUrls;
83
qt_dump_frame_loader(bool b)84 void QWEBKIT_EXPORT qt_dump_frame_loader(bool b)
85 {
86 dumpFrameLoaderCallbacks = b;
87 }
88
qt_dump_resource_load_callbacks(bool b)89 void QWEBKIT_EXPORT qt_dump_resource_load_callbacks(bool b)
90 {
91 dumpResourceLoadCallbacks = b;
92 }
93
94 // Compare with WebKitTools/DumpRenderTree/mac/FrameLoadDelegate.mm
drtDescriptionSuitableForTestResult(WebCore::Frame * _frame)95 static QString drtDescriptionSuitableForTestResult(WebCore::Frame* _frame)
96 {
97 QWebFrame* frame = QWebFramePrivate::kit(_frame);
98 QString name = frame->frameName();
99
100 bool isMainFrame = frame == frame->page()->mainFrame();
101 if (isMainFrame) {
102 if (!name.isEmpty())
103 return QString::fromLatin1("main frame \"%1\"").arg(name);
104 return QLatin1String("main frame");
105 } else {
106 if (!name.isEmpty())
107 return QString::fromLatin1("frame \"%1\"").arg(name);
108 return QLatin1String("frame (anonymous)");
109 }
110 }
111
drtDescriptionSuitableForTestResult(const WebCore::KURL & _url)112 static QString drtDescriptionSuitableForTestResult(const WebCore::KURL& _url)
113 {
114 QUrl url = _url;
115 return url.toString();
116 }
117
drtDescriptionSuitableForTestResult(const WebCore::ResourceError & error)118 static QString drtDescriptionSuitableForTestResult(const WebCore::ResourceError& error)
119 {
120 QString failingURL = error.failingURL();
121 return QString::fromLatin1("<NSError domain NSURLErrorDomain, code %1, failing URL \"%2\">").arg(error.errorCode()).arg(failingURL);
122 }
123
drtDescriptionSuitableForTestResult(const WebCore::ResourceRequest & request)124 static QString drtDescriptionSuitableForTestResult(const WebCore::ResourceRequest& request)
125 {
126 QString url = request.url().string();
127 return QString::fromLatin1("<NSURLRequest %1>").arg(url);
128 }
129
drtDescriptionSuitableForTestResult(const WebCore::ResourceResponse & response)130 static QString drtDescriptionSuitableForTestResult(const WebCore::ResourceResponse& response)
131 {
132 QString text = response.httpStatusText();
133 if (text.isEmpty())
134 return QLatin1String("(null)");
135
136 return text;
137 }
138
139
140 namespace WebCore
141 {
142
FrameLoaderClientQt()143 FrameLoaderClientQt::FrameLoaderClientQt()
144 : m_frame(0)
145 , m_webFrame(0)
146 , m_firstData(false)
147 , m_pluginView(0)
148 , m_hasSentResponseToPlugin(false)
149 , m_loadError (ResourceError())
150 {
151 }
152
153
~FrameLoaderClientQt()154 FrameLoaderClientQt::~FrameLoaderClientQt()
155 {
156 }
157
setFrame(QWebFrame * webFrame,Frame * frame)158 void FrameLoaderClientQt::setFrame(QWebFrame* webFrame, Frame* frame)
159 {
160 m_webFrame = webFrame;
161 m_frame = frame;
162 if (!m_webFrame || !m_webFrame->page()) {
163 qWarning("FrameLoaderClientQt::setFrame frame without Page!");
164 return;
165 }
166
167 connect(this, SIGNAL(loadStarted()),
168 m_webFrame->page(), SIGNAL(loadStarted()));
169 connect(this, SIGNAL(loadStarted()),
170 m_webFrame, SIGNAL(loadStarted()));
171 connect(this, SIGNAL(loadProgress(int)),
172 m_webFrame->page(), SIGNAL(loadProgress(int)));
173 connect(this, SIGNAL(loadFinished(bool)),
174 m_webFrame->page(), SIGNAL(loadFinished(bool)));
175 connect(this, SIGNAL(loadFinished(bool)),
176 m_webFrame, SIGNAL(loadFinished(bool)));
177 connect(this, SIGNAL(titleChanged(QString)),
178 m_webFrame, SIGNAL(titleChanged(QString)));
179 }
180
webFrame() const181 QWebFrame* FrameLoaderClientQt::webFrame() const
182 {
183 return m_webFrame;
184 }
185
callPolicyFunction(FramePolicyFunction function,PolicyAction action)186 void FrameLoaderClientQt::callPolicyFunction(FramePolicyFunction function, PolicyAction action)
187 {
188 (m_frame->loader()->policyChecker()->*function)(action);
189 }
190
hasWebView() const191 bool FrameLoaderClientQt::hasWebView() const
192 {
193 //notImplemented();
194 return true;
195 }
196
savePlatformDataToCachedFrame(CachedFrame *)197 void FrameLoaderClientQt::savePlatformDataToCachedFrame(CachedFrame*)
198 {
199 notImplemented();
200 }
201
transitionToCommittedFromCachedFrame(CachedFrame *)202 void FrameLoaderClientQt::transitionToCommittedFromCachedFrame(CachedFrame*)
203 {
204 }
205
transitionToCommittedForNewPage()206 void FrameLoaderClientQt::transitionToCommittedForNewPage()
207 {
208 ASSERT(m_frame);
209 ASSERT(m_webFrame);
210
211 QBrush brush = m_webFrame->page()->palette().brush(QPalette::Base);
212 QColor backgroundColor = brush.style() == Qt::SolidPattern ? brush.color() : QColor();
213
214 QWebPage* page = m_webFrame->page();
215 const QSize preferredLayoutSize = page->preferredContentsSize();
216
217 m_frame->createView(m_webFrame->page()->viewportSize(),
218 backgroundColor, !backgroundColor.alpha(),
219 preferredLayoutSize.isValid() ? IntSize(preferredLayoutSize) : IntSize(),
220 preferredLayoutSize.isValid(),
221 (ScrollbarMode)m_webFrame->scrollBarPolicy(Qt::Horizontal),
222 (ScrollbarMode)m_webFrame->scrollBarPolicy(Qt::Vertical));
223 }
224
225
makeRepresentation(DocumentLoader *)226 void FrameLoaderClientQt::makeRepresentation(DocumentLoader*)
227 {
228 // don't need this for now I think.
229 }
230
231
forceLayout()232 void FrameLoaderClientQt::forceLayout()
233 {
234 FrameView* view = m_frame->view();
235 if (view)
236 view->forceLayout(true);
237 }
238
239
forceLayoutForNonHTML()240 void FrameLoaderClientQt::forceLayoutForNonHTML()
241 {
242 }
243
244
setCopiesOnScroll()245 void FrameLoaderClientQt::setCopiesOnScroll()
246 {
247 // apparently mac specific
248 }
249
250
detachedFromParent2()251 void FrameLoaderClientQt::detachedFromParent2()
252 {
253 }
254
255
detachedFromParent3()256 void FrameLoaderClientQt::detachedFromParent3()
257 {
258 }
259
dispatchDidHandleOnloadEvents()260 void FrameLoaderClientQt::dispatchDidHandleOnloadEvents()
261 {
262 // don't need this one
263 if (dumpFrameLoaderCallbacks)
264 printf("%s - didHandleOnloadEventsForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
265
266 }
267
268
dispatchDidReceiveServerRedirectForProvisionalLoad()269 void FrameLoaderClientQt::dispatchDidReceiveServerRedirectForProvisionalLoad()
270 {
271 if (dumpFrameLoaderCallbacks)
272 printf("%s - didReceiveServerRedirectForProvisionalLoadForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
273
274 notImplemented();
275 }
276
277
dispatchDidCancelClientRedirect()278 void FrameLoaderClientQt::dispatchDidCancelClientRedirect()
279 {
280 if (dumpFrameLoaderCallbacks)
281 printf("%s - didCancelClientRedirectForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
282
283 notImplemented();
284 }
285
286
dispatchWillPerformClientRedirect(const KURL & url,double,double)287 void FrameLoaderClientQt::dispatchWillPerformClientRedirect(const KURL& url, double, double)
288 {
289 if (dumpFrameLoaderCallbacks)
290 printf("%s - willPerformClientRedirectToURL: %s \n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)), qPrintable(drtDescriptionSuitableForTestResult(url)));
291
292 notImplemented();
293 }
294
295
dispatchDidChangeLocationWithinPage()296 void FrameLoaderClientQt::dispatchDidChangeLocationWithinPage()
297 {
298 if (dumpFrameLoaderCallbacks)
299 printf("%s - didChangeLocationWithinPageForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
300
301 if (!m_webFrame)
302 return;
303
304 emit m_webFrame->urlChanged(m_webFrame->url());
305 m_webFrame->page()->d->updateNavigationActions();
306 }
307
dispatchDidPushStateWithinPage()308 void FrameLoaderClientQt::dispatchDidPushStateWithinPage()
309 {
310 if (dumpFrameLoaderCallbacks)
311 printf("%s - dispatchDidPushStateWithinPage\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
312
313 notImplemented();
314 }
315
dispatchDidReplaceStateWithinPage()316 void FrameLoaderClientQt::dispatchDidReplaceStateWithinPage()
317 {
318 if (dumpFrameLoaderCallbacks)
319 printf("%s - dispatchDidReplaceStateWithinPage\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
320
321 notImplemented();
322 }
323
dispatchDidPopStateWithinPage()324 void FrameLoaderClientQt::dispatchDidPopStateWithinPage()
325 {
326 if (dumpFrameLoaderCallbacks)
327 printf("%s - dispatchDidPopStateWithinPage\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
328
329 notImplemented();
330 }
331
dispatchWillClose()332 void FrameLoaderClientQt::dispatchWillClose()
333 {
334 }
335
336
dispatchDidStartProvisionalLoad()337 void FrameLoaderClientQt::dispatchDidStartProvisionalLoad()
338 {
339 if (dumpFrameLoaderCallbacks)
340 printf("%s - didStartProvisionalLoadForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
341
342 if (m_webFrame)
343 emit m_webFrame->provisionalLoad();
344 }
345
346
dispatchDidReceiveTitle(const String & title)347 void FrameLoaderClientQt::dispatchDidReceiveTitle(const String& title)
348 {
349 if (dumpFrameLoaderCallbacks)
350 printf("%s - didReceiveTitle: %s\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)), qPrintable(QString(title)));
351
352 if (!m_webFrame)
353 return;
354
355 emit titleChanged(title);
356 }
357
358
dispatchDidCommitLoad()359 void FrameLoaderClientQt::dispatchDidCommitLoad()
360 {
361 if (dumpFrameLoaderCallbacks)
362 printf("%s - didCommitLoadForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
363
364 if (m_frame->tree()->parent() || !m_webFrame)
365 return;
366
367 emit m_webFrame->urlChanged(m_webFrame->url());
368 m_webFrame->page()->d->updateNavigationActions();
369
370 // We should assume first the frame has no title. If it has, then the above dispatchDidReceiveTitle()
371 // will be called very soon with the correct title.
372 // This properly resets the title when we navigate to a URI without a title.
373 emit titleChanged(String());
374 }
375
376
dispatchDidFinishDocumentLoad()377 void FrameLoaderClientQt::dispatchDidFinishDocumentLoad()
378 {
379 if (dumpFrameLoaderCallbacks)
380 printf("%s - didFinishDocumentLoadForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
381
382 if (QWebPagePrivate::drtRun) {
383 int unloadEventCount = m_frame->domWindow()->pendingUnloadEventListeners();
384 if (unloadEventCount)
385 printf("%s - has %u onunload handler(s)\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)), unloadEventCount);
386 }
387
388 if (m_frame->tree()->parent() || !m_webFrame)
389 return;
390
391 m_webFrame->page()->d->updateNavigationActions();
392 }
393
394
dispatchDidFinishLoad()395 void FrameLoaderClientQt::dispatchDidFinishLoad()
396 {
397 if (dumpFrameLoaderCallbacks)
398 printf("%s - didFinishLoadForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
399
400 // Clears the previous error.
401 m_loadError = ResourceError();
402
403 if (!m_webFrame)
404 return;
405 m_webFrame->page()->d->updateNavigationActions();
406 }
407
408
dispatchDidFirstLayout()409 void FrameLoaderClientQt::dispatchDidFirstLayout()
410 {
411 if (m_webFrame)
412 emit m_webFrame->initialLayoutCompleted();
413 }
414
dispatchDidFirstVisuallyNonEmptyLayout()415 void FrameLoaderClientQt::dispatchDidFirstVisuallyNonEmptyLayout()
416 {
417 notImplemented();
418 }
419
dispatchShow()420 void FrameLoaderClientQt::dispatchShow()
421 {
422 notImplemented();
423 }
424
425
cancelPolicyCheck()426 void FrameLoaderClientQt::cancelPolicyCheck()
427 {
428 // qDebug() << "FrameLoaderClientQt::cancelPolicyCheck";
429 }
430
431
dispatchWillSubmitForm(FramePolicyFunction function,PassRefPtr<FormState>)432 void FrameLoaderClientQt::dispatchWillSubmitForm(FramePolicyFunction function,
433 PassRefPtr<FormState>)
434 {
435 notImplemented();
436 // FIXME: This is surely too simple
437 callPolicyFunction(function, PolicyUse);
438 }
439
440
dispatchDidLoadMainResource(DocumentLoader *)441 void FrameLoaderClientQt::dispatchDidLoadMainResource(DocumentLoader*)
442 {
443 }
444
445
revertToProvisionalState(DocumentLoader *)446 void FrameLoaderClientQt::revertToProvisionalState(DocumentLoader*)
447 {
448 notImplemented();
449 }
450
451
postProgressStartedNotification()452 void FrameLoaderClientQt::postProgressStartedNotification()
453 {
454 if (m_webFrame && m_frame->page()) {
455 // A new load starts, so lets clear the previous error.
456 m_loadError = ResourceError();
457 emit loadStarted();
458 postProgressEstimateChangedNotification();
459 }
460 if (m_frame->tree()->parent() || !m_webFrame)
461 return;
462 m_webFrame->page()->d->updateNavigationActions();
463 }
464
postProgressEstimateChangedNotification()465 void FrameLoaderClientQt::postProgressEstimateChangedNotification()
466 {
467 if (m_webFrame && m_frame->page())
468 emit loadProgress(qRound(m_frame->page()->progress()->estimatedProgress() * 100));
469 }
470
postProgressFinishedNotification()471 void FrameLoaderClientQt::postProgressFinishedNotification()
472 {
473 // send a mousemove event to
474 // (1) update the cursor to change according to whatever is underneath the mouse cursor right now
475 // (2) display the tool tip if the mouse hovers a node which has a tool tip
476 if (m_frame && m_frame->eventHandler() && m_webFrame->page()) {
477 QWidget* view = m_webFrame->page()->view();
478 if (view && view->hasFocus()) {
479 QPoint localPos = view->mapFromGlobal(QCursor::pos());
480 if (view->rect().contains(localPos)) {
481 QMouseEvent event(QEvent::MouseMove, localPos, Qt::NoButton, Qt::NoButton, Qt::NoModifier);
482 m_frame->eventHandler()->mouseMoved(PlatformMouseEvent(&event, 0));
483 }
484 }
485 }
486
487 if (m_webFrame && m_frame->page())
488 emit loadFinished(m_loadError.isNull());
489 }
490
setMainFrameDocumentReady(bool)491 void FrameLoaderClientQt::setMainFrameDocumentReady(bool)
492 {
493 // this is only interesting once we provide an external API for the DOM
494 }
495
496
willChangeTitle(DocumentLoader *)497 void FrameLoaderClientQt::willChangeTitle(DocumentLoader*)
498 {
499 // no need for, dispatchDidReceiveTitle is the right callback
500 }
501
502
didChangeTitle(DocumentLoader *)503 void FrameLoaderClientQt::didChangeTitle(DocumentLoader *)
504 {
505 // no need for, dispatchDidReceiveTitle is the right callback
506 }
507
508
finishedLoading(DocumentLoader * loader)509 void FrameLoaderClientQt::finishedLoading(DocumentLoader* loader)
510 {
511 if (!m_pluginView) {
512 if(m_firstData) {
513 FrameLoader *fl = loader->frameLoader();
514 fl->setEncoding(m_response.textEncodingName(), false);
515 m_firstData = false;
516 }
517 }
518 else {
519 m_pluginView->didFinishLoading();
520 m_pluginView = 0;
521 m_hasSentResponseToPlugin = false;
522 }
523 }
524
525
canShowMIMEType(const String & MIMEType) const526 bool FrameLoaderClientQt::canShowMIMEType(const String& MIMEType) const
527 {
528 if (MIMETypeRegistry::isSupportedImageMIMEType(MIMEType))
529 return true;
530
531 if (MIMETypeRegistry::isSupportedNonImageMIMEType(MIMEType))
532 return true;
533
534 if (m_frame && m_frame->settings() && m_frame->settings()->arePluginsEnabled()
535 && PluginDatabase::installedPlugins()->isMIMETypeRegistered(MIMEType))
536 return true;
537
538 return false;
539 }
540
representationExistsForURLScheme(const String &) const541 bool FrameLoaderClientQt::representationExistsForURLScheme(const String&) const
542 {
543 return false;
544 }
545
546
generatedMIMETypeForURLScheme(const String &) const547 String FrameLoaderClientQt::generatedMIMETypeForURLScheme(const String&) const
548 {
549 notImplemented();
550 return String();
551 }
552
553
frameLoadCompleted()554 void FrameLoaderClientQt::frameLoadCompleted()
555 {
556 // Note: Can be called multiple times.
557 }
558
559
restoreViewState()560 void FrameLoaderClientQt::restoreViewState()
561 {
562 if (!m_webFrame)
563 return;
564 emit m_webFrame->page()->restoreFrameStateRequested(m_webFrame);
565 }
566
567
provisionalLoadStarted()568 void FrameLoaderClientQt::provisionalLoadStarted()
569 {
570 // don't need to do anything here
571 }
572
573
didFinishLoad()574 void FrameLoaderClientQt::didFinishLoad()
575 {
576 // notImplemented();
577 }
578
579
prepareForDataSourceReplacement()580 void FrameLoaderClientQt::prepareForDataSourceReplacement()
581 {
582 }
583
setTitle(const String &,const KURL &)584 void FrameLoaderClientQt::setTitle(const String&, const KURL&)
585 {
586 // no need for, dispatchDidReceiveTitle is the right callback
587 }
588
589
userAgent(const KURL & url)590 String FrameLoaderClientQt::userAgent(const KURL& url)
591 {
592 if (m_webFrame) {
593 return m_webFrame->page()->userAgentForUrl(url);
594 }
595 return String();
596 }
597
dispatchDidReceiveIcon()598 void FrameLoaderClientQt::dispatchDidReceiveIcon()
599 {
600 if (m_webFrame) {
601 emit m_webFrame->iconChanged();
602 }
603 }
604
frameLoaderDestroyed()605 void FrameLoaderClientQt::frameLoaderDestroyed()
606 {
607 delete m_webFrame;
608 m_frame = 0;
609 m_webFrame = 0;
610
611 delete this;
612 }
613
canHandleRequest(const WebCore::ResourceRequest &) const614 bool FrameLoaderClientQt::canHandleRequest(const WebCore::ResourceRequest&) const
615 {
616 return true;
617 }
618
dispatchDidClearWindowObjectInWorld(DOMWrapperWorld * world)619 void FrameLoaderClientQt::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld* world)
620 {
621 if (world != mainThreadNormalWorld())
622 return;
623
624 if (m_webFrame)
625 emit m_webFrame->javaScriptWindowObjectCleared();
626 }
627
documentElementAvailable()628 void FrameLoaderClientQt::documentElementAvailable()
629 {
630 return;
631 }
632
didPerformFirstNavigation() const633 void FrameLoaderClientQt::didPerformFirstNavigation() const
634 {
635 if (m_frame->tree()->parent() || !m_webFrame)
636 return;
637 m_webFrame->page()->d->updateNavigationActions();
638 }
639
registerForIconNotification(bool)640 void FrameLoaderClientQt::registerForIconNotification(bool)
641 {
642 notImplemented();
643 }
644
updateGlobalHistory()645 void FrameLoaderClientQt::updateGlobalHistory()
646 {
647 QWebHistoryInterface *history = QWebHistoryInterface::defaultInterface();
648 if (history)
649 history->addHistoryEntry(m_frame->loader()->documentLoader()->urlForHistory().prettyURL());
650 }
651
updateGlobalHistoryRedirectLinks()652 void FrameLoaderClientQt::updateGlobalHistoryRedirectLinks()
653 {
654 }
655
shouldGoToHistoryItem(WebCore::HistoryItem *) const656 bool FrameLoaderClientQt::shouldGoToHistoryItem(WebCore::HistoryItem *) const
657 {
658 return true;
659 }
660
dispatchDidAddBackForwardItem(WebCore::HistoryItem *) const661 void FrameLoaderClientQt::dispatchDidAddBackForwardItem(WebCore::HistoryItem*) const
662 {
663 }
664
dispatchDidRemoveBackForwardItem(WebCore::HistoryItem *) const665 void FrameLoaderClientQt::dispatchDidRemoveBackForwardItem(WebCore::HistoryItem*) const
666 {
667 }
668
dispatchDidChangeBackForwardIndex() const669 void FrameLoaderClientQt::dispatchDidChangeBackForwardIndex() const
670 {
671 }
672
didDisplayInsecureContent()673 void FrameLoaderClientQt::didDisplayInsecureContent()
674 {
675 if (dumpFrameLoaderCallbacks)
676 printf("didDisplayInsecureContent\n");
677
678 notImplemented();
679 }
680
didRunInsecureContent(WebCore::SecurityOrigin *)681 void FrameLoaderClientQt::didRunInsecureContent(WebCore::SecurityOrigin*)
682 {
683 if (dumpFrameLoaderCallbacks)
684 printf("didRunInsecureContent\n");
685
686 notImplemented();
687 }
688
saveViewStateToItem(WebCore::HistoryItem * item)689 void FrameLoaderClientQt::saveViewStateToItem(WebCore::HistoryItem* item)
690 {
691 QWebHistoryItem historyItem(new QWebHistoryItemPrivate(item));
692 emit m_webFrame->page()->saveFrameStateRequested(m_webFrame, &historyItem);
693 }
694
canCachePage() const695 bool FrameLoaderClientQt::canCachePage() const
696 {
697 return true;
698 }
699
setMainDocumentError(WebCore::DocumentLoader * loader,const WebCore::ResourceError & error)700 void FrameLoaderClientQt::setMainDocumentError(WebCore::DocumentLoader* loader, const WebCore::ResourceError& error)
701 {
702 if (!m_pluginView) {
703 if (m_firstData) {
704 loader->frameLoader()->setEncoding(m_response.textEncodingName(), false);
705 m_firstData = false;
706 }
707 } else {
708 m_pluginView->didFail(error);
709 m_pluginView = 0;
710 m_hasSentResponseToPlugin = false;
711 }
712 }
713
committedLoad(WebCore::DocumentLoader * loader,const char * data,int length)714 void FrameLoaderClientQt::committedLoad(WebCore::DocumentLoader* loader, const char* data, int length)
715 {
716 if (!m_pluginView) {
717 if (!m_frame)
718 return;
719 FrameLoader *fl = loader->frameLoader();
720 if (m_firstData) {
721 fl->setEncoding(m_response.textEncodingName(), false);
722 m_firstData = false;
723 }
724 fl->addData(data, length);
725 }
726
727 // We re-check here as the plugin can have been created
728 if (m_pluginView) {
729 if (!m_hasSentResponseToPlugin) {
730 m_pluginView->didReceiveResponse(loader->response());
731 // didReceiveResponse sets up a new stream to the plug-in. on a full-page plug-in, a failure in
732 // setting up this stream can cause the main document load to be cancelled, setting m_pluginView
733 // to null
734 if (!m_pluginView)
735 return;
736 m_hasSentResponseToPlugin = true;
737 }
738 m_pluginView->didReceiveData(data, length);
739 }
740 }
741
cancelledError(const WebCore::ResourceRequest & request)742 WebCore::ResourceError FrameLoaderClientQt::cancelledError(const WebCore::ResourceRequest& request)
743 {
744 ResourceError error = ResourceError("QtNetwork", QNetworkReply::OperationCanceledError, request.url().prettyURL(),
745 QCoreApplication::translate("QWebFrame", "Request cancelled", 0, QCoreApplication::UnicodeUTF8));
746 error.setIsCancellation(true);
747 return error;
748 }
749
750 // copied from WebKit/Misc/WebKitErrors[Private].h
751 enum {
752 WebKitErrorCannotShowMIMEType = 100,
753 WebKitErrorCannotShowURL = 101,
754 WebKitErrorFrameLoadInterruptedByPolicyChange = 102,
755 WebKitErrorCannotUseRestrictedPort = 103,
756 WebKitErrorCannotFindPlugIn = 200,
757 WebKitErrorCannotLoadPlugIn = 201,
758 WebKitErrorJavaUnavailable = 202,
759 };
760
blockedError(const WebCore::ResourceRequest & request)761 WebCore::ResourceError FrameLoaderClientQt::blockedError(const WebCore::ResourceRequest& request)
762 {
763 return ResourceError("WebKit", WebKitErrorCannotUseRestrictedPort, request.url().prettyURL(),
764 QCoreApplication::translate("QWebFrame", "Request blocked", 0, QCoreApplication::UnicodeUTF8));
765 }
766
767
cannotShowURLError(const WebCore::ResourceRequest & request)768 WebCore::ResourceError FrameLoaderClientQt::cannotShowURLError(const WebCore::ResourceRequest& request)
769 {
770 return ResourceError("WebKit", WebKitErrorCannotShowURL, request.url().string(),
771 QCoreApplication::translate("QWebFrame", "Cannot show URL", 0, QCoreApplication::UnicodeUTF8));
772 }
773
interruptForPolicyChangeError(const WebCore::ResourceRequest & request)774 WebCore::ResourceError FrameLoaderClientQt::interruptForPolicyChangeError(const WebCore::ResourceRequest& request)
775 {
776 return ResourceError("WebKit", WebKitErrorFrameLoadInterruptedByPolicyChange, request.url().string(),
777 QCoreApplication::translate("QWebFrame", "Frame load interrupted by policy change", 0, QCoreApplication::UnicodeUTF8));
778 }
779
cannotShowMIMETypeError(const WebCore::ResourceResponse & response)780 WebCore::ResourceError FrameLoaderClientQt::cannotShowMIMETypeError(const WebCore::ResourceResponse& response)
781 {
782 return ResourceError("WebKit", WebKitErrorCannotShowMIMEType, response.url().string(),
783 QCoreApplication::translate("QWebFrame", "Cannot show mimetype", 0, QCoreApplication::UnicodeUTF8));
784 }
785
fileDoesNotExistError(const WebCore::ResourceResponse & response)786 WebCore::ResourceError FrameLoaderClientQt::fileDoesNotExistError(const WebCore::ResourceResponse& response)
787 {
788 return ResourceError("QtNetwork", QNetworkReply::ContentNotFoundError, response.url().string(),
789 QCoreApplication::translate("QWebFrame", "File does not exist", 0, QCoreApplication::UnicodeUTF8));
790 }
791
pluginWillHandleLoadError(const WebCore::ResourceResponse &)792 WebCore::ResourceError FrameLoaderClientQt::pluginWillHandleLoadError(const WebCore::ResourceResponse&)
793 {
794 notImplemented();
795 return ResourceError();
796 }
797
shouldFallBack(const WebCore::ResourceError &)798 bool FrameLoaderClientQt::shouldFallBack(const WebCore::ResourceError&)
799 {
800 notImplemented();
801 return false;
802 }
803
createDocumentLoader(const WebCore::ResourceRequest & request,const SubstituteData & substituteData)804 WTF::PassRefPtr<WebCore::DocumentLoader> FrameLoaderClientQt::createDocumentLoader(const WebCore::ResourceRequest& request, const SubstituteData& substituteData)
805 {
806 RefPtr<DocumentLoader> loader = DocumentLoader::create(request, substituteData);
807 if (substituteData.isValid())
808 loader->setDeferMainResourceDataLoad(false);
809 return loader.release();
810 }
811
download(WebCore::ResourceHandle * handle,const WebCore::ResourceRequest &,const WebCore::ResourceRequest &,const WebCore::ResourceResponse &)812 void FrameLoaderClientQt::download(WebCore::ResourceHandle* handle, const WebCore::ResourceRequest&, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&)
813 {
814 if (!m_webFrame)
815 return;
816
817 QNetworkReplyHandler* handler = handle->getInternal()->m_job;
818 QNetworkReply* reply = handler->release();
819 if (reply) {
820 QWebPage *page = m_webFrame->page();
821 if (page->forwardUnsupportedContent())
822 emit m_webFrame->page()->unsupportedContent(reply);
823 else
824 reply->abort();
825 }
826 }
827
assignIdentifierToInitialRequest(unsigned long identifier,WebCore::DocumentLoader *,const WebCore::ResourceRequest & request)828 void FrameLoaderClientQt::assignIdentifierToInitialRequest(unsigned long identifier, WebCore::DocumentLoader*, const WebCore::ResourceRequest& request)
829 {
830 if (dumpResourceLoadCallbacks)
831 dumpAssignedUrls[identifier] = drtDescriptionSuitableForTestResult(request.url());
832 }
833
dispatchWillSendRequest(WebCore::DocumentLoader *,unsigned long identifier,WebCore::ResourceRequest & newRequest,const WebCore::ResourceResponse & redirectResponse)834 void FrameLoaderClientQt::dispatchWillSendRequest(WebCore::DocumentLoader*, unsigned long identifier, WebCore::ResourceRequest& newRequest, const WebCore::ResourceResponse& redirectResponse)
835 {
836 if (dumpResourceLoadCallbacks)
837 printf("%s - willSendRequest %s redirectResponse %s\n",
838 qPrintable(dumpAssignedUrls[identifier]),
839 qPrintable(drtDescriptionSuitableForTestResult(newRequest)),
840 qPrintable(drtDescriptionSuitableForTestResult(redirectResponse)));
841
842 // seems like the Mac code doesn't do anything here by default neither
843 //qDebug() << "FrameLoaderClientQt::dispatchWillSendRequest" << request.isNull() << request.url().string`();
844 }
845
846 bool
shouldUseCredentialStorage(DocumentLoader *,unsigned long)847 FrameLoaderClientQt::shouldUseCredentialStorage(DocumentLoader*, unsigned long)
848 {
849 notImplemented();
850 return false;
851 }
852
dispatchDidReceiveAuthenticationChallenge(DocumentLoader *,unsigned long,const AuthenticationChallenge &)853 void FrameLoaderClientQt::dispatchDidReceiveAuthenticationChallenge(DocumentLoader*, unsigned long, const AuthenticationChallenge&)
854 {
855 notImplemented();
856 }
857
dispatchDidCancelAuthenticationChallenge(DocumentLoader *,unsigned long,const AuthenticationChallenge &)858 void FrameLoaderClientQt::dispatchDidCancelAuthenticationChallenge(DocumentLoader*, unsigned long, const AuthenticationChallenge&)
859 {
860 notImplemented();
861 }
862
dispatchDidReceiveResponse(WebCore::DocumentLoader *,unsigned long,const WebCore::ResourceResponse & response)863 void FrameLoaderClientQt::dispatchDidReceiveResponse(WebCore::DocumentLoader*, unsigned long, const WebCore::ResourceResponse& response)
864 {
865
866 m_response = response;
867 m_firstData = true;
868 //qDebug() << " got response from" << response.url().string();
869 }
870
dispatchDidReceiveContentLength(WebCore::DocumentLoader *,unsigned long,int)871 void FrameLoaderClientQt::dispatchDidReceiveContentLength(WebCore::DocumentLoader*, unsigned long, int)
872 {
873 }
874
dispatchDidFinishLoading(WebCore::DocumentLoader *,unsigned long)875 void FrameLoaderClientQt::dispatchDidFinishLoading(WebCore::DocumentLoader*, unsigned long)
876 {
877 }
878
dispatchDidFailLoading(WebCore::DocumentLoader * loader,unsigned long identifier,const WebCore::ResourceError & error)879 void FrameLoaderClientQt::dispatchDidFailLoading(WebCore::DocumentLoader* loader, unsigned long identifier, const WebCore::ResourceError& error)
880 {
881 if (dumpResourceLoadCallbacks)
882 printf("%s - didFailLoadingWithError: %s\n", qPrintable(dumpAssignedUrls[identifier]), qPrintable(drtDescriptionSuitableForTestResult(error)));
883
884 if (m_firstData) {
885 FrameLoader *fl = loader->frameLoader();
886 fl->setEncoding(m_response.textEncodingName(), false);
887 m_firstData = false;
888 }
889 }
890
dispatchDidLoadResourceFromMemoryCache(WebCore::DocumentLoader *,const WebCore::ResourceRequest &,const WebCore::ResourceResponse &,int)891 bool FrameLoaderClientQt::dispatchDidLoadResourceFromMemoryCache(WebCore::DocumentLoader*, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, int)
892 {
893 notImplemented();
894 return false;
895 }
896
dispatchDidLoadResourceByXMLHttpRequest(unsigned long,const WebCore::ScriptString &)897 void FrameLoaderClientQt::dispatchDidLoadResourceByXMLHttpRequest(unsigned long, const WebCore::ScriptString&)
898 {
899 notImplemented();
900 }
901
callErrorPageExtension(const WebCore::ResourceError & error)902 void FrameLoaderClientQt::callErrorPageExtension(const WebCore::ResourceError& error)
903 {
904 QWebPage* page = m_webFrame->page();
905 if (page->supportsExtension(QWebPage::ErrorPageExtension)) {
906 QWebPage::ErrorPageExtensionOption option;
907
908 if (error.domain() == "QtNetwork")
909 option.domain = QWebPage::QtNetwork;
910 else if (error.domain() == "HTTP")
911 option.domain = QWebPage::Http;
912 else if (error.domain() == "WebKit")
913 option.domain = QWebPage::WebKit;
914 else
915 return;
916
917 option.url = QUrl(error.failingURL());
918 option.frame = m_webFrame;
919 option.error = error.errorCode();
920 option.errorString = error.localizedDescription();
921
922 QWebPage::ErrorPageExtensionReturn output;
923 if (!page->extension(QWebPage::ErrorPageExtension, &option, &output))
924 return;
925
926 KURL baseUrl(output.baseUrl);
927 KURL failingUrl(option.url);
928
929 WebCore::ResourceRequest request(baseUrl);
930 WTF::RefPtr<WebCore::SharedBuffer> buffer = WebCore::SharedBuffer::create(output.content.constData(), output.content.length());
931 WebCore::SubstituteData substituteData(buffer, output.contentType, output.encoding, failingUrl);
932 m_frame->loader()->load(request, substituteData, false);
933 }
934 }
935
dispatchDidFailProvisionalLoad(const WebCore::ResourceError & error)936 void FrameLoaderClientQt::dispatchDidFailProvisionalLoad(const WebCore::ResourceError& error)
937 {
938 if (dumpFrameLoaderCallbacks)
939 printf("%s - didFailProvisionalLoadWithError\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
940
941 m_loadError = error;
942 if (!error.isNull() && !error.isCancellation())
943 callErrorPageExtension(error);
944 }
945
dispatchDidFailLoad(const WebCore::ResourceError & error)946 void FrameLoaderClientQt::dispatchDidFailLoad(const WebCore::ResourceError& error)
947 {
948 if (dumpFrameLoaderCallbacks)
949 printf("%s - didFailLoadWithError\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
950
951 m_loadError = error;
952 if (!error.isNull() && !error.isCancellation())
953 callErrorPageExtension(error);
954 }
955
dispatchCreatePage()956 WebCore::Frame* FrameLoaderClientQt::dispatchCreatePage()
957 {
958 if (!m_webFrame)
959 return 0;
960 QWebPage *newPage = m_webFrame->page()->createWindow(QWebPage::WebBrowserWindow);
961 if (!newPage)
962 return 0;
963 return newPage->mainFrame()->d->frame;
964 }
965
dispatchDecidePolicyForMIMEType(FramePolicyFunction function,const WebCore::String & MIMEType,const WebCore::ResourceRequest &)966 void FrameLoaderClientQt::dispatchDecidePolicyForMIMEType(FramePolicyFunction function, const WebCore::String& MIMEType, const WebCore::ResourceRequest&)
967 {
968 // we need to call directly here
969 if (canShowMIMEType(MIMEType))
970 callPolicyFunction(function, PolicyUse);
971 else
972 callPolicyFunction(function, PolicyDownload);
973 }
974
dispatchDecidePolicyForNewWindowAction(FramePolicyFunction function,const WebCore::NavigationAction & action,const WebCore::ResourceRequest & request,PassRefPtr<WebCore::FormState>,const WebCore::String &)975 void FrameLoaderClientQt::dispatchDecidePolicyForNewWindowAction(FramePolicyFunction function, const WebCore::NavigationAction& action, const WebCore::ResourceRequest& request, PassRefPtr<WebCore::FormState>, const WebCore::String&)
976 {
977 Q_ASSERT(m_webFrame);
978 QNetworkRequest r(request.toNetworkRequest(m_webFrame));
979 QWebPage* page = m_webFrame->page();
980
981 if (!page->d->acceptNavigationRequest(0, r, QWebPage::NavigationType(action.type()))) {
982 if (action.type() == NavigationTypeFormSubmitted || action.type() == NavigationTypeFormResubmitted)
983 m_frame->loader()->resetMultipleFormSubmissionProtection();
984
985 if (action.type() == NavigationTypeLinkClicked && r.url().hasFragment()) {
986 ResourceRequest emptyRequest;
987 m_frame->loader()->activeDocumentLoader()->setLastCheckedRequest(emptyRequest);
988 }
989
990 callPolicyFunction(function, PolicyIgnore);
991 return;
992 }
993 callPolicyFunction(function, PolicyUse);
994 }
995
dispatchDecidePolicyForNavigationAction(FramePolicyFunction function,const WebCore::NavigationAction & action,const WebCore::ResourceRequest & request,PassRefPtr<WebCore::FormState>)996 void FrameLoaderClientQt::dispatchDecidePolicyForNavigationAction(FramePolicyFunction function, const WebCore::NavigationAction& action, const WebCore::ResourceRequest& request, PassRefPtr<WebCore::FormState>)
997 {
998 Q_ASSERT(m_webFrame);
999 QNetworkRequest r(request.toNetworkRequest(m_webFrame));
1000 QWebPage*page = m_webFrame->page();
1001
1002 if (!page->d->acceptNavigationRequest(m_webFrame, r, QWebPage::NavigationType(action.type()))) {
1003 if (action.type() == NavigationTypeFormSubmitted || action.type() == NavigationTypeFormResubmitted)
1004 m_frame->loader()->resetMultipleFormSubmissionProtection();
1005
1006 if (action.type() == NavigationTypeLinkClicked && r.url().hasFragment()) {
1007 ResourceRequest emptyRequest;
1008 m_frame->loader()->activeDocumentLoader()->setLastCheckedRequest(emptyRequest);
1009 }
1010
1011 callPolicyFunction(function, PolicyIgnore);
1012 return;
1013 }
1014 callPolicyFunction(function, PolicyUse);
1015 }
1016
dispatchUnableToImplementPolicy(const WebCore::ResourceError &)1017 void FrameLoaderClientQt::dispatchUnableToImplementPolicy(const WebCore::ResourceError&)
1018 {
1019 notImplemented();
1020 }
1021
startDownload(const WebCore::ResourceRequest & request)1022 void FrameLoaderClientQt::startDownload(const WebCore::ResourceRequest& request)
1023 {
1024 if (!m_webFrame)
1025 return;
1026
1027 emit m_webFrame->page()->downloadRequested(request.toNetworkRequest(m_webFrame));
1028 }
1029
createFrame(const KURL & url,const String & name,HTMLFrameOwnerElement * ownerElement,const String & referrer,bool allowsScrolling,int marginWidth,int marginHeight)1030 PassRefPtr<Frame> FrameLoaderClientQt::createFrame(const KURL& url, const String& name, HTMLFrameOwnerElement* ownerElement,
1031 const String& referrer, bool allowsScrolling, int marginWidth, int marginHeight)
1032 {
1033 if (!m_webFrame)
1034 return 0;
1035
1036 QWebFrameData frameData(m_frame->page(), m_frame, ownerElement, name);
1037
1038 if (url.isEmpty())
1039 frameData.url = blankURL();
1040 else
1041 frameData.url = url;
1042
1043 frameData.referrer = referrer;
1044 frameData.allowsScrolling = allowsScrolling;
1045 frameData.marginWidth = marginWidth;
1046 frameData.marginHeight = marginHeight;
1047
1048 QPointer<QWebFrame> webFrame = new QWebFrame(m_webFrame, &frameData);
1049 // The creation of the frame may have run arbitrary JavaScript that removed it from the page already.
1050 if (!webFrame->d->frame->page()) {
1051 frameData.frame.release();
1052 ASSERT(webFrame.isNull());
1053 return 0;
1054 }
1055
1056 emit m_webFrame->page()->frameCreated(webFrame);
1057
1058 // ### set override encoding if we have one
1059
1060 frameData.frame->loader()->loadURLIntoChildFrame(frameData.url, frameData.referrer, frameData.frame.get());
1061
1062 // The frame's onload handler may have removed it from the document.
1063 if (!frameData.frame->tree()->parent())
1064 return 0;
1065
1066 return frameData.frame.release();
1067 }
1068
objectContentType(const KURL & url,const String & _mimeType)1069 ObjectContentType FrameLoaderClientQt::objectContentType(const KURL& url, const String& _mimeType)
1070 {
1071 // qDebug()<<" ++++++++++++++++ url is "<<url.prettyURL()<<", mime = "<<_mimeType;
1072 if (_mimeType == "application/x-qt-plugin" || _mimeType == "application/x-qt-styled-widget")
1073 return ObjectContentOtherPlugin;
1074
1075 if (url.isEmpty() && !_mimeType.length())
1076 return ObjectContentNone;
1077
1078 String mimeType = _mimeType;
1079 if (!mimeType.length()) {
1080 QFileInfo fi(url.path());
1081 mimeType = MIMETypeRegistry::getMIMETypeForExtension(fi.suffix());
1082 }
1083
1084 if (!mimeType.length())
1085 return ObjectContentFrame;
1086
1087 if (MIMETypeRegistry::isSupportedImageMIMEType(mimeType))
1088 return ObjectContentImage;
1089
1090 if (PluginDatabase::installedPlugins()->isMIMETypeRegistered(mimeType))
1091 return ObjectContentNetscapePlugin;
1092
1093 if (m_frame->page() && m_frame->page()->pluginData() && m_frame->page()->pluginData()->supportsMimeType(mimeType))
1094 return ObjectContentOtherPlugin;
1095
1096 if (MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType))
1097 return ObjectContentFrame;
1098
1099 if (url.protocol() == "about")
1100 return ObjectContentFrame;
1101
1102 return ObjectContentNone;
1103 }
1104
1105 static const CSSPropertyID qstyleSheetProperties[] = {
1106 CSSPropertyColor,
1107 CSSPropertyFontFamily,
1108 CSSPropertyFontSize,
1109 CSSPropertyFontStyle,
1110 CSSPropertyFontWeight
1111 };
1112
1113 const unsigned numqStyleSheetProperties = sizeof(qstyleSheetProperties) / sizeof(qstyleSheetProperties[0]);
1114
1115 class QtPluginWidget: public Widget
1116 {
1117 public:
QtPluginWidget(QWidget * w=0)1118 QtPluginWidget(QWidget* w = 0): Widget(w) {}
~QtPluginWidget()1119 ~QtPluginWidget()
1120 {
1121 if (platformWidget())
1122 platformWidget()->deleteLater();
1123 }
invalidateRect(const IntRect & r)1124 virtual void invalidateRect(const IntRect& r)
1125 {
1126 if (platformWidget())
1127 platformWidget()->update(r);
1128 }
frameRectsChanged()1129 virtual void frameRectsChanged()
1130 {
1131 if (!platformWidget())
1132 return;
1133
1134 IntRect windowRect = convertToContainingWindow(IntRect(0, 0, frameRect().width(), frameRect().height()));
1135 platformWidget()->setGeometry(windowRect);
1136
1137 ScrollView* parentScrollView = parent();
1138 if (!parentScrollView)
1139 return;
1140
1141 ASSERT(parentScrollView->isFrameView());
1142 IntRect clipRect(static_cast<FrameView*>(parentScrollView)->windowClipRect());
1143 clipRect.move(-windowRect.x(), -windowRect.y());
1144 clipRect.intersect(platformWidget()->rect());
1145
1146 QRegion clipRegion = QRegion(clipRect);
1147 platformWidget()->setMask(clipRegion);
1148
1149 handleVisibility();
1150 }
1151
show()1152 virtual void show()
1153 {
1154 Widget::show();
1155 handleVisibility();
1156 }
1157
1158 private:
handleVisibility()1159 void handleVisibility()
1160 {
1161 if (!isVisible())
1162 return;
1163
1164 // if setMask is set with an empty QRegion, no clipping will
1165 // be performed, so in that case we hide the platformWidget
1166 QRegion mask = platformWidget()->mask();
1167 platformWidget()->setVisible(!mask.isEmpty());
1168 }
1169 };
1170
1171 #if QT_VERSION >= 0x040600
1172 class QtPluginGraphicsWidget: public Widget
1173 {
1174 public:
create(QGraphicsWidget * w=0)1175 static RefPtr<QtPluginGraphicsWidget> create(QGraphicsWidget* w = 0)
1176 {
1177 return adoptRef(new QtPluginGraphicsWidget(w));
1178 }
1179
~QtPluginGraphicsWidget()1180 ~QtPluginGraphicsWidget()
1181 {
1182 if (graphicsWidget)
1183 graphicsWidget->deleteLater();
1184 }
invalidateRect(const IntRect & r)1185 virtual void invalidateRect(const IntRect& r)
1186 {
1187 QGraphicsScene* scene = graphicsWidget ? graphicsWidget->scene() : 0;
1188 if (scene)
1189 scene->update(QRect(r));
1190 }
frameRectsChanged()1191 virtual void frameRectsChanged()
1192 {
1193 if (!graphicsWidget)
1194 return;
1195
1196 IntRect windowRect = convertToContainingWindow(IntRect(0, 0, frameRect().width(), frameRect().height()));
1197 graphicsWidget->setGeometry(QRect(windowRect));
1198
1199 // FIXME: clipping of graphics widgets
1200 }
show()1201 virtual void show()
1202 {
1203 if (graphicsWidget)
1204 graphicsWidget->show();
1205 }
hide()1206 virtual void hide()
1207 {
1208 if (graphicsWidget)
1209 graphicsWidget->hide();
1210 }
1211 private:
QtPluginGraphicsWidget(QGraphicsWidget * w=0)1212 QtPluginGraphicsWidget(QGraphicsWidget* w = 0): Widget(0), graphicsWidget(w) {}
1213
1214 QGraphicsWidget* graphicsWidget;
1215 };
1216 #endif
1217
createPlugin(const IntSize & pluginSize,HTMLPlugInElement * element,const KURL & url,const Vector<String> & paramNames,const Vector<String> & paramValues,const String & mimeType,bool loadManually)1218 PassRefPtr<Widget> FrameLoaderClientQt::createPlugin(const IntSize& pluginSize, HTMLPlugInElement* element, const KURL& url, const Vector<String>& paramNames,
1219 const Vector<String>& paramValues, const String& mimeType, bool loadManually)
1220 {
1221 // qDebug()<<"------ Creating plugin in FrameLoaderClientQt::createPlugin for "<<url.prettyURL() << mimeType;
1222 // qDebug()<<"------\t url = "<<url.prettyURL();
1223
1224 if (!m_webFrame)
1225 return 0;
1226
1227 QStringList params;
1228 QStringList values;
1229 QString classid(element->getAttribute("classid"));
1230
1231 for (unsigned i = 0; i < paramNames.size(); ++i) {
1232 params.append(paramNames[i]);
1233 if (paramNames[i] == "classid")
1234 classid = paramValues[i];
1235 }
1236 for (unsigned i = 0; i < paramValues.size(); ++i)
1237 values.append(paramValues[i]);
1238
1239 QString urlStr(url.string());
1240 QUrl qurl = urlStr;
1241
1242 QObject* object = 0;
1243
1244 if (mimeType == "application/x-qt-plugin" || mimeType == "application/x-qt-styled-widget") {
1245 object = m_webFrame->page()->createPlugin(classid, qurl, params, values);
1246 #ifndef QT_NO_STYLE_STYLESHEET
1247 QWidget* widget = qobject_cast<QWidget*>(object);
1248 if (widget && mimeType == "application/x-qt-styled-widget") {
1249
1250 QString styleSheet = element->getAttribute("style");
1251 if (!styleSheet.isEmpty())
1252 styleSheet += QLatin1Char(';');
1253
1254 for (unsigned i = 0; i < numqStyleSheetProperties; ++i) {
1255 CSSPropertyID property = qstyleSheetProperties[i];
1256
1257 styleSheet += QString::fromLatin1(::getPropertyName(property));
1258 styleSheet += QLatin1Char(':');
1259 styleSheet += computedStyle(element)->getPropertyValue(property);
1260 styleSheet += QLatin1Char(';');
1261 }
1262
1263 widget->setStyleSheet(styleSheet);
1264 }
1265 #endif // QT_NO_STYLE_STYLESHEET
1266 }
1267
1268 if (!object) {
1269 QWebPluginFactory* factory = m_webFrame->page()->pluginFactory();
1270 if (factory)
1271 object = factory->create(mimeType, qurl, params, values);
1272 }
1273
1274 if (object) {
1275 QWidget* widget = qobject_cast<QWidget*>(object);
1276 if (widget) {
1277 QWidget* parentWidget = 0;
1278 if (m_webFrame->page()->d->client)
1279 parentWidget = qobject_cast<QWidget*>(m_webFrame->page()->d->client->pluginParent());
1280 if (parentWidget) // don't reparent to nothing (i.e. keep whatever parent QWebPage::createPlugin() chose.
1281 widget->setParent(parentWidget);
1282 widget->hide();
1283 RefPtr<QtPluginWidget> w = adoptRef(new QtPluginWidget());
1284 w->setPlatformWidget(widget);
1285 // Make sure it's invisible until properly placed into the layout
1286 w->setFrameRect(IntRect(0, 0, 0, 0));
1287 return w;
1288 }
1289 #if QT_VERSION >= 0x040600
1290 QGraphicsWidget* graphicsWidget = qobject_cast<QGraphicsWidget*>(object);
1291 if (graphicsWidget) {
1292 QGraphicsObject* parentWidget = 0;
1293 if (m_webFrame->page()->d->client)
1294 parentWidget = qobject_cast<QGraphicsObject*>(m_webFrame->page()->d->client->pluginParent());
1295 graphicsWidget->hide();
1296 if (parentWidget) // don't reparent to nothing (i.e. keep whatever parent QWebPage::createPlugin() chose.
1297 graphicsWidget->setParentItem(parentWidget);
1298 RefPtr<QtPluginGraphicsWidget> w = QtPluginGraphicsWidget::create(graphicsWidget);
1299 // Make sure it's invisible until properly placed into the layout
1300 w->setFrameRect(IntRect(0, 0, 0, 0));
1301 return w;
1302 }
1303 #endif
1304 // FIXME: make things work for widgetless plugins as well
1305 delete object;
1306 } else { // NPAPI Plugins
1307 Vector<String> params = paramNames;
1308 Vector<String> values = paramValues;
1309 if (mimeType == "application/x-shockwave-flash") {
1310 QWebPageClient* client = m_webFrame->page()->d->client;
1311 if (!client || !qobject_cast<QWidget*>(client->pluginParent())) {
1312 // inject wmode=opaque when there is no client or the client is not a QWebView
1313 size_t wmodeIndex = params.find("wmode");
1314 if (wmodeIndex == -1) {
1315 params.append("wmode");
1316 values.append("opaque");
1317 } else
1318 values[wmodeIndex] = "opaque";
1319 }
1320 }
1321
1322 RefPtr<PluginView> pluginView = PluginView::create(m_frame, pluginSize, element, url,
1323 params, values, mimeType, loadManually);
1324 return pluginView;
1325 }
1326
1327 return 0;
1328 }
1329
redirectDataToPlugin(Widget * pluginWidget)1330 void FrameLoaderClientQt::redirectDataToPlugin(Widget* pluginWidget)
1331 {
1332 ASSERT(!m_pluginView);
1333 m_pluginView = static_cast<PluginView*>(pluginWidget);
1334 m_hasSentResponseToPlugin = false;
1335 }
1336
createJavaAppletWidget(const IntSize &,HTMLAppletElement *,const KURL &,const Vector<String> &,const Vector<String> &)1337 PassRefPtr<Widget> FrameLoaderClientQt::createJavaAppletWidget(const IntSize&, HTMLAppletElement*, const KURL&,
1338 const Vector<String>&, const Vector<String>&)
1339 {
1340 notImplemented();
1341 return 0;
1342 }
1343
overrideMediaType() const1344 String FrameLoaderClientQt::overrideMediaType() const
1345 {
1346 return String();
1347 }
1348
chooseFile(const QString & oldFile)1349 QString FrameLoaderClientQt::chooseFile(const QString& oldFile)
1350 {
1351 return webFrame()->page()->chooseFile(webFrame(), oldFile);
1352 }
1353
1354 }
1355
1356 #include "moc_FrameLoaderClientQt.cpp"
1357