1 /*
2 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public License
15 * along with this program; see the file COPYING.LIB. If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 *
19 */
20
21 #include "config.h"
22 #include "qwkpage.h"
23 #include "qwkpage_p.h"
24
25 #include "qwkpreferences_p.h"
26
27 #include "ChunkedUpdateDrawingAreaProxy.h"
28 #include "ClientImpl.h"
29 #include "qgraphicswkview.h"
30 #include "qwkcontext.h"
31 #include "qwkcontext_p.h"
32 #include "qwkhistory.h"
33 #include "qwkhistory_p.h"
34 #include "FindIndicator.h"
35 #include "LocalizedStrings.h"
36 #include "NativeWebKeyboardEvent.h"
37 #include "NativeWebMouseEvent.h"
38 #include "NotImplemented.h"
39 #include "TiledDrawingAreaProxy.h"
40 #include "WebContext.h"
41 #include "WebContextMenuProxyQt.h"
42 #include "WebEventFactoryQt.h"
43 #include "WebPopupMenuProxyQt.h"
44 #include "WKStringQt.h"
45 #include "WKURLQt.h"
46 #include "ViewportArguments.h"
47 #include <QAction>
48 #include <QApplication>
49 #include <QGraphicsSceneMouseEvent>
50 #include <QStyle>
51 #include <QTouchEvent>
52 #include <QtDebug>
53 #include <WebCore/Cursor.h>
54 #include <WebCore/FloatRect.h>
55 #include <WebCore/NotImplemented.h>
56 #include <WebKit2/WKFrame.h>
57 #include <WebKit2/WKPageGroup.h>
58 #include <WebKit2/WKRetainPtr.h>
59
60 using namespace WebKit;
61 using namespace WebCore;
62
contextMenuActionForWebAction(QWKPage::WebAction action)63 static WebCore::ContextMenuAction contextMenuActionForWebAction(QWKPage::WebAction action)
64 {
65 switch (action) {
66 case QWKPage::OpenLink:
67 return WebCore::ContextMenuItemTagOpenLink;
68 case QWKPage::OpenLinkInNewWindow:
69 return WebCore::ContextMenuItemTagOpenLinkInNewWindow;
70 case QWKPage::CopyLinkToClipboard:
71 return WebCore::ContextMenuItemTagCopyLinkToClipboard;
72 case QWKPage::OpenImageInNewWindow:
73 return WebCore::ContextMenuItemTagOpenImageInNewWindow;
74 case QWKPage::Cut:
75 return WebCore::ContextMenuItemTagCut;
76 case QWKPage::Copy:
77 return WebCore::ContextMenuItemTagCopy;
78 case QWKPage::Paste:
79 return WebCore::ContextMenuItemTagPaste;
80 case QWKPage::SelectAll:
81 return WebCore::ContextMenuItemTagSelectAll;
82 default:
83 ASSERT(false);
84 break;
85 }
86 return WebCore::ContextMenuItemTagNoAction;
87 }
88
QWKPagePrivate(QWKPage * qq,QWKContext * c)89 QWKPagePrivate::QWKPagePrivate(QWKPage* qq, QWKContext* c)
90 : q(qq)
91 , view(0)
92 , context(c)
93 , preferences(0)
94 , createNewPageFn(0)
95 , backingStoreType(QGraphicsWKView::Simple)
96 , isConnectedToEngine(true)
97 {
98 memset(actions, 0, sizeof(actions));
99 page = context->d->context->createWebPage(this, 0);
100 history = QWKHistoryPrivate::createHistory(page->backForwardList());
101 }
102
~QWKPagePrivate()103 QWKPagePrivate::~QWKPagePrivate()
104 {
105 page->close();
106 delete history;
107 }
108
init(QGraphicsItem * view,QGraphicsWKView::BackingStoreType backingStoreType)109 void QWKPagePrivate::init(QGraphicsItem* view, QGraphicsWKView::BackingStoreType backingStoreType)
110 {
111 this->view = view;
112 this->backingStoreType = backingStoreType;
113 page->initializeWebPage();
114 }
115
setCursor(const WebCore::Cursor & cursor)116 void QWKPagePrivate::setCursor(const WebCore::Cursor& cursor)
117 {
118 #ifndef QT_NO_CURSOR
119 emit q->cursorChanged(*cursor.platformCursor());
120 #endif
121 }
122
setViewportArguments(const ViewportArguments & args)123 void QWKPagePrivate::setViewportArguments(const ViewportArguments& args)
124 {
125 viewportArguments = args;
126 emit q->viewportChangeRequested();
127 }
128
createDrawingAreaProxy()129 PassOwnPtr<DrawingAreaProxy> QWKPagePrivate::createDrawingAreaProxy()
130 {
131 // FIXME: We should avoid this cast by decoupling the view from the page.
132 QGraphicsWKView* wkView = static_cast<QGraphicsWKView*>(view);
133
134 #if ENABLE(TILED_BACKING_STORE)
135 if (backingStoreType == QGraphicsWKView::Tiled)
136 return TiledDrawingAreaProxy::create(wkView, page.get());
137 #endif
138 return ChunkedUpdateDrawingAreaProxy::create(wkView, page.get());
139 }
140
setViewNeedsDisplay(const WebCore::IntRect & rect)141 void QWKPagePrivate::setViewNeedsDisplay(const WebCore::IntRect& rect)
142 {
143 view->update(QRect(rect));
144 }
145
displayView()146 void QWKPagePrivate::displayView()
147 {
148 // FIXME: Implement.
149 }
150
scrollView(const WebCore::IntRect & scrollRect,const WebCore::IntSize & scrollOffset)151 void QWKPagePrivate::scrollView(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset)
152 {
153 // FIXME: Implement.
154 }
155
viewSize()156 WebCore::IntSize QWKPagePrivate::viewSize()
157 {
158 // FIXME: Implement.
159 return WebCore::IntSize();
160 }
161
isViewWindowActive()162 bool QWKPagePrivate::isViewWindowActive()
163 {
164 return view && view->isActive();
165 }
166
isViewFocused()167 bool QWKPagePrivate::isViewFocused()
168 {
169 return view && view->hasFocus();
170 }
171
isViewVisible()172 bool QWKPagePrivate::isViewVisible()
173 {
174 return view && view->isVisible();
175 }
176
isViewInWindow()177 bool QWKPagePrivate::isViewInWindow()
178 {
179 // FIXME: Implement.
180 return true;
181 }
182
enterAcceleratedCompositingMode(const LayerTreeContext &)183 void QWKPagePrivate::enterAcceleratedCompositingMode(const LayerTreeContext&)
184 {
185 // FIXME: Implement.
186 }
187
exitAcceleratedCompositingMode()188 void QWKPagePrivate::exitAcceleratedCompositingMode()
189 {
190 // FIXME: Implement.
191 }
192
pageDidRequestScroll(const IntPoint & point)193 void QWKPagePrivate::pageDidRequestScroll(const IntPoint& point)
194 {
195 emit q->scrollRequested(point.x(), point.y());
196 }
197
didChangeContentsSize(const IntSize & newSize)198 void QWKPagePrivate::didChangeContentsSize(const IntSize& newSize)
199 {
200 emit q->contentsSizeChanged(QSize(newSize));
201 }
202
toolTipChanged(const String &,const String & newTooltip)203 void QWKPagePrivate::toolTipChanged(const String&, const String& newTooltip)
204 {
205 emit q->toolTipChanged(QString(newTooltip));
206 }
207
registerEditCommand(PassRefPtr<WebEditCommandProxy>,WebPageProxy::UndoOrRedo)208 void QWKPagePrivate::registerEditCommand(PassRefPtr<WebEditCommandProxy>, WebPageProxy::UndoOrRedo)
209 {
210 }
211
clearAllEditCommands()212 void QWKPagePrivate::clearAllEditCommands()
213 {
214 }
215
canUndoRedo(WebPageProxy::UndoOrRedo)216 bool QWKPagePrivate::canUndoRedo(WebPageProxy::UndoOrRedo)
217 {
218 return false;
219 }
220
executeUndoRedo(WebPageProxy::UndoOrRedo)221 void QWKPagePrivate::executeUndoRedo(WebPageProxy::UndoOrRedo)
222 {
223 }
224
convertToDeviceSpace(const FloatRect & rect)225 FloatRect QWKPagePrivate::convertToDeviceSpace(const FloatRect& rect)
226 {
227 return rect;
228 }
229
windowToScreen(const IntRect & rect)230 IntRect QWKPagePrivate::windowToScreen(const IntRect& rect)
231 {
232 return rect;
233 }
234
convertToUserSpace(const FloatRect & rect)235 FloatRect QWKPagePrivate::convertToUserSpace(const FloatRect& rect)
236 {
237 return rect;
238 }
239
selectionChanged(bool,bool,bool,bool)240 void QWKPagePrivate::selectionChanged(bool, bool, bool, bool)
241 {
242 }
243
doneWithKeyEvent(const NativeWebKeyboardEvent &,bool)244 void QWKPagePrivate::doneWithKeyEvent(const NativeWebKeyboardEvent&, bool)
245 {
246 }
247
createPopupMenuProxy(WebPageProxy *)248 PassRefPtr<WebPopupMenuProxy> QWKPagePrivate::createPopupMenuProxy(WebPageProxy*)
249 {
250 return WebPopupMenuProxyQt::create();
251 }
252
createContextMenuProxy(WebPageProxy *)253 PassRefPtr<WebContextMenuProxy> QWKPagePrivate::createContextMenuProxy(WebPageProxy*)
254 {
255 return WebContextMenuProxyQt::create(q);
256 }
257
setFindIndicator(PassRefPtr<FindIndicator>,bool fadeOut)258 void QWKPagePrivate::setFindIndicator(PassRefPtr<FindIndicator>, bool fadeOut)
259 {
260 }
261
didCommitLoadForMainFrame(bool useCustomRepresentation)262 void QWKPagePrivate::didCommitLoadForMainFrame(bool useCustomRepresentation)
263 {
264 }
265
didFinishLoadingDataForCustomRepresentation(const String & suggestedFilename,const CoreIPC::DataReference &)266 void QWKPagePrivate::didFinishLoadingDataForCustomRepresentation(const String& suggestedFilename, const CoreIPC::DataReference&)
267 {
268 }
269
flashBackingStoreUpdates(const Vector<IntRect> &)270 void QWKPagePrivate::flashBackingStoreUpdates(const Vector<IntRect>&)
271 {
272 notImplemented();
273 }
274
paint(QPainter * painter,QRect area)275 void QWKPagePrivate::paint(QPainter* painter, QRect area)
276 {
277 if (page->isValid() && page->drawingArea())
278 page->drawingArea()->paint(IntRect(area), painter);
279 else
280 painter->fillRect(area, Qt::white);
281 }
282
keyPressEvent(QKeyEvent * ev)283 void QWKPagePrivate::keyPressEvent(QKeyEvent* ev)
284 {
285 page->handleKeyboardEvent(NativeWebKeyboardEvent(ev));
286 }
287
keyReleaseEvent(QKeyEvent * ev)288 void QWKPagePrivate::keyReleaseEvent(QKeyEvent* ev)
289 {
290 page->handleKeyboardEvent(NativeWebKeyboardEvent(ev));
291 }
292
mouseMoveEvent(QGraphicsSceneMouseEvent * ev)293 void QWKPagePrivate::mouseMoveEvent(QGraphicsSceneMouseEvent* ev)
294 {
295 // For some reason mouse press results in mouse hover (which is
296 // converted to mouse move for WebKit). We ignore these hover
297 // events by comparing lastPos with newPos.
298 // NOTE: lastPos from the event always comes empty, so we work
299 // around that here.
300 static QPointF lastPos = QPointF();
301 if (lastPos == ev->pos())
302 return;
303 lastPos = ev->pos();
304
305 page->handleMouseEvent(NativeWebMouseEvent(ev, 0));
306 }
307
mousePressEvent(QGraphicsSceneMouseEvent * ev)308 void QWKPagePrivate::mousePressEvent(QGraphicsSceneMouseEvent* ev)
309 {
310 if (tripleClickTimer.isActive() && (ev->pos() - tripleClick).manhattanLength() < QApplication::startDragDistance()) {
311 page->handleMouseEvent(NativeWebMouseEvent(ev, 3));
312 return;
313 }
314
315 page->handleMouseEvent(NativeWebMouseEvent(ev, 1));
316 }
317
mouseReleaseEvent(QGraphicsSceneMouseEvent * ev)318 void QWKPagePrivate::mouseReleaseEvent(QGraphicsSceneMouseEvent* ev)
319 {
320 page->handleMouseEvent(NativeWebMouseEvent(ev, 0));
321 }
322
mouseDoubleClickEvent(QGraphicsSceneMouseEvent * ev)323 void QWKPagePrivate::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* ev)
324 {
325 page->handleMouseEvent(NativeWebMouseEvent(ev, 2));
326
327 tripleClickTimer.start(QApplication::doubleClickInterval(), q);
328 tripleClick = ev->pos().toPoint();
329 }
330
wheelEvent(QGraphicsSceneWheelEvent * ev)331 void QWKPagePrivate::wheelEvent(QGraphicsSceneWheelEvent* ev)
332 {
333 WebWheelEvent wheelEvent = WebEventFactory::createWebWheelEvent(ev);
334 page->handleWheelEvent(wheelEvent);
335 }
336
updateAction(QWKPage::WebAction action)337 void QWKPagePrivate::updateAction(QWKPage::WebAction action)
338 {
339 #ifdef QT_NO_ACTION
340 Q_UNUSED(action)
341 #else
342 QAction* a = actions[action];
343 if (!a)
344 return;
345
346 RefPtr<WebKit::WebFrameProxy> mainFrame = page->mainFrame();
347 if (!mainFrame)
348 return;
349
350 bool enabled = a->isEnabled();
351 bool checked = a->isChecked();
352
353 switch (action) {
354 case QWKPage::Back:
355 enabled = page->canGoBack();
356 break;
357 case QWKPage::Forward:
358 enabled = page->canGoForward();
359 break;
360 case QWKPage::Stop:
361 enabled = !(WebFrameProxy::LoadStateFinished == mainFrame->loadState());
362 break;
363 case QWKPage::Reload:
364 enabled = (WebFrameProxy::LoadStateFinished == mainFrame->loadState());
365 break;
366 default:
367 break;
368 }
369
370 a->setEnabled(enabled);
371
372 if (a->isCheckable())
373 a->setChecked(checked);
374 #endif // QT_NO_ACTION
375 }
376
updateNavigationActions()377 void QWKPagePrivate::updateNavigationActions()
378 {
379 updateAction(QWKPage::Back);
380 updateAction(QWKPage::Forward);
381 updateAction(QWKPage::Stop);
382 updateAction(QWKPage::Reload);
383 }
384
385 #ifndef QT_NO_ACTION
_q_webActionTriggered(bool checked)386 void QWKPagePrivate::_q_webActionTriggered(bool checked)
387 {
388 QAction* a = qobject_cast<QAction*>(q->sender());
389 if (!a)
390 return;
391 QWKPage::WebAction action = static_cast<QWKPage::WebAction>(a->data().toInt());
392 q->triggerAction(action, checked);
393 }
394 #endif // QT_NO_ACTION
395
touchEvent(QTouchEvent * event)396 void QWKPagePrivate::touchEvent(QTouchEvent* event)
397 {
398 #if ENABLE(TOUCH_EVENTS)
399 WebTouchEvent touchEvent = WebEventFactory::createWebTouchEvent(event);
400 page->handleTouchEvent(touchEvent);
401 #else
402 event->ignore();
403 #endif
404 }
405
didRelaunchProcess()406 void QWKPagePrivate::didRelaunchProcess()
407 {
408 QGraphicsWKView* wkView = static_cast<QGraphicsWKView*>(view);
409 if (wkView)
410 q->setViewportSize(wkView->size().toSize());
411
412 isConnectedToEngine = true;
413 emit q->engineConnectionChanged(true);
414 }
415
processDidCrash()416 void QWKPagePrivate::processDidCrash()
417 {
418 isConnectedToEngine = false;
419 emit q->engineConnectionChanged(false);
420 }
421
QWKPage(QWKContext * context)422 QWKPage::QWKPage(QWKContext* context)
423 : d(new QWKPagePrivate(this, context))
424 {
425 WKPageLoaderClient loadClient = {
426 0, /* version */
427 this, /* clientInfo */
428 qt_wk_didStartProvisionalLoadForFrame,
429 qt_wk_didReceiveServerRedirectForProvisionalLoadForFrame,
430 qt_wk_didFailProvisionalLoadWithErrorForFrame,
431 qt_wk_didCommitLoadForFrame,
432 qt_wk_didFinishDocumentLoadForFrame,
433 qt_wk_didFinishLoadForFrame,
434 qt_wk_didFailLoadWithErrorForFrame,
435 0, /* didSameDocumentNavigationForFrame */
436 qt_wk_didReceiveTitleForFrame,
437 qt_wk_didFirstLayoutForFrame,
438 qt_wk_didFirstVisuallyNonEmptyLayoutForFrame,
439 qt_wk_didRemoveFrameFromHierarchy,
440 0, /* didDisplayInsecureContentForFrame */
441 0, /* didRunInsecureContentForFrame */
442 0, /* canAuthenticateAgainstProtectionSpaceInFrame */
443 0, /* didReceiveAuthenticationChallengeInFrame */
444 qt_wk_didStartProgress,
445 qt_wk_didChangeProgress,
446 qt_wk_didFinishProgress,
447 qt_wk_didBecomeUnresponsive,
448 qt_wk_didBecomeResponsive,
449 0, /* processDidCrash */
450 0, /* didChangeBackForwardList */
451 0 /* shouldGoToBackForwardListItem */
452 };
453 WKPageSetPageLoaderClient(pageRef(), &loadClient);
454
455 WKPageUIClient uiClient = {
456 0, /* version */
457 this, /* clientInfo */
458 qt_wk_createNewPage,
459 qt_wk_showPage,
460 qt_wk_close,
461 qt_wk_takeFocus,
462 0, /* focus */
463 0, /* unfocus */
464 qt_wk_runJavaScriptAlert,
465 0, /* runJavaScriptConfirm */
466 0, /* runJavaScriptPrompt */
467 qt_wk_setStatusText,
468 0, /* mouseDidMoveOverElement */
469 0, /* missingPluginButtonClicked */
470 0, /* didNotHandleKeyEvent */
471 0, /* toolbarsAreVisible */
472 0, /* setToolbarsAreVisible */
473 0, /* menuBarIsVisible */
474 0, /* setMenuBarIsVisible */
475 0, /* statusBarIsVisible */
476 0, /* setStatusBarIsVisible */
477 0, /* isResizable */
478 0, /* setIsResizable */
479 0, /* getWindowFrame */
480 0, /* setWindowFrame */
481 0, /* runBeforeUnloadConfirmPanel */
482 0, /* didDraw */
483 0, /* pageDidScroll */
484 0, /* exceededDatabaseQuota */
485 0, /* runOpenPanel */
486 0, /* decidePolicyForGeolocationPermissionRequest */
487 0, /* headerHeight */
488 0, /* footerHeight */
489 0, /* drawHeader */
490 0, /* drawFooter */
491 0, /* printFrame */
492 0, /* runModal */
493 0, /* didCompleteRubberBandForMainFrame */
494 0 /* saveDataToFileInDownloadsFolder */
495 };
496 WKPageSetPageUIClient(pageRef(), &uiClient);
497 }
498
~QWKPage()499 QWKPage::~QWKPage()
500 {
501 delete d;
502 }
503
ViewportAttributes()504 QWKPage::ViewportAttributes::ViewportAttributes()
505 : d(0)
506 , m_initialScaleFactor(-1.0)
507 , m_minimumScaleFactor(-1.0)
508 , m_maximumScaleFactor(-1.0)
509 , m_devicePixelRatio(-1.0)
510 , m_isUserScalable(true)
511 , m_isValid(false)
512 {
513
514 }
515
ViewportAttributes(const QWKPage::ViewportAttributes & other)516 QWKPage::ViewportAttributes::ViewportAttributes(const QWKPage::ViewportAttributes& other)
517 : d(other.d)
518 , m_initialScaleFactor(other.m_initialScaleFactor)
519 , m_minimumScaleFactor(other.m_minimumScaleFactor)
520 , m_maximumScaleFactor(other.m_maximumScaleFactor)
521 , m_devicePixelRatio(other.m_devicePixelRatio)
522 , m_isUserScalable(other.m_isUserScalable)
523 , m_isValid(other.m_isValid)
524 , m_size(other.m_size)
525 {
526
527 }
528
~ViewportAttributes()529 QWKPage::ViewportAttributes::~ViewportAttributes()
530 {
531
532 }
533
operator =(const QWKPage::ViewportAttributes & other)534 QWKPage::ViewportAttributes& QWKPage::ViewportAttributes::operator=(const QWKPage::ViewportAttributes& other)
535 {
536 if (this != &other) {
537 d = other.d;
538 m_initialScaleFactor = other.m_initialScaleFactor;
539 m_minimumScaleFactor = other.m_minimumScaleFactor;
540 m_maximumScaleFactor = other.m_maximumScaleFactor;
541 m_devicePixelRatio = other.m_devicePixelRatio;
542 m_isUserScalable = other.m_isUserScalable;
543 m_isValid = other.m_isValid;
544 m_size = other.m_size;
545 }
546
547 return *this;
548 }
549
viewportAttributesForSize(const QSize & availableSize) const550 QWKPage::ViewportAttributes QWKPage::viewportAttributesForSize(const QSize& availableSize) const
551 {
552 static int desktopWidth = 980;
553 static int deviceDPI = 160;
554
555 ViewportAttributes result;
556
557 if (availableSize.isEmpty())
558 return result; // Returns an invalid instance.
559
560 // FIXME: Add a way to get these data via the platform plugin and fall back
561 // to the size of the view.
562 int deviceWidth = 480;
563 int deviceHeight = 864;
564
565 WebCore::ViewportAttributes conf = WebCore::computeViewportAttributes(d->viewportArguments, desktopWidth, deviceWidth, deviceHeight, deviceDPI, availableSize);
566
567 result.m_isValid = true;
568 result.m_size = conf.layoutSize;
569 result.m_initialScaleFactor = conf.initialScale;
570 result.m_minimumScaleFactor = conf.minimumScale;
571 result.m_maximumScaleFactor = conf.maximumScale;
572 result.m_devicePixelRatio = conf.devicePixelRatio;
573 result.m_isUserScalable = static_cast<bool>(conf.userScalable);
574
575 return result;
576 }
577
setActualVisibleContentsRect(const QRect & rect) const578 void QWKPage::setActualVisibleContentsRect(const QRect& rect) const
579 {
580 #if ENABLE(TILED_BACKING_STORE)
581 d->page->setActualVisibleContentRect(rect);
582 #endif
583 }
584
timerEvent(QTimerEvent * ev)585 void QWKPage::timerEvent(QTimerEvent* ev)
586 {
587 int timerId = ev->timerId();
588 if (timerId == d->tripleClickTimer.timerId())
589 d->tripleClickTimer.stop();
590 else
591 QObject::timerEvent(ev);
592 }
593
pageRef() const594 WKPageRef QWKPage::pageRef() const
595 {
596 return toAPI(d->page.get());
597 }
598
context() const599 QWKContext* QWKPage::context() const
600 {
601 return d->context;
602 }
603
preferences() const604 QWKPreferences* QWKPage::preferences() const
605 {
606 if (!d->preferences) {
607 WKPageGroupRef pageGroupRef = WKPageGetPageGroup(pageRef());
608 d->preferences = QWKPreferencesPrivate::createPreferences(pageGroupRef);
609 }
610
611 return d->preferences;
612 }
613
setCreateNewPageFunction(CreateNewPageFn function)614 void QWKPage::setCreateNewPageFunction(CreateNewPageFn function)
615 {
616 d->createNewPageFn = function;
617 }
618
setCustomUserAgent(const QString & userAgent)619 void QWKPage::setCustomUserAgent(const QString& userAgent)
620 {
621 WKRetainPtr<WKStringRef> wkUserAgent(WKStringCreateWithQString(userAgent));
622 WKPageSetCustomUserAgent(pageRef(), wkUserAgent.get());
623 }
624
customUserAgent() const625 QString QWKPage::customUserAgent() const
626 {
627 return WKStringCopyQString(WKPageCopyCustomUserAgent(pageRef()));
628 }
629
load(const QUrl & url)630 void QWKPage::load(const QUrl& url)
631 {
632 WKRetainPtr<WKURLRef> wkurl(WKURLCreateWithQUrl(url));
633 WKPageLoadURL(pageRef(), wkurl.get());
634 }
635
setUrl(const QUrl & url)636 void QWKPage::setUrl(const QUrl& url)
637 {
638 load(url);
639 }
640
url() const641 QUrl QWKPage::url() const
642 {
643 WKRetainPtr<WKFrameRef> frame = WKPageGetMainFrame(pageRef());
644 if (!frame)
645 return QUrl();
646 return WKURLCopyQUrl(WKFrameCopyURL(frame.get()));
647 }
648
title() const649 QString QWKPage::title() const
650 {
651 return WKStringCopyQString(WKPageCopyTitle(pageRef()));
652 }
653
setViewportSize(const QSize & size)654 void QWKPage::setViewportSize(const QSize& size)
655 {
656 if (d->page->drawingArea())
657 d->page->drawingArea()->setSize(IntSize(size), IntSize());
658 }
659
textZoomFactor() const660 qreal QWKPage::textZoomFactor() const
661 {
662 return WKPageGetTextZoomFactor(pageRef());
663 }
664
setTextZoomFactor(qreal zoomFactor)665 void QWKPage::setTextZoomFactor(qreal zoomFactor)
666 {
667 WKPageSetTextZoomFactor(pageRef(), zoomFactor);
668 }
669
pageZoomFactor() const670 qreal QWKPage::pageZoomFactor() const
671 {
672 return WKPageGetPageZoomFactor(pageRef());
673 }
674
setPageZoomFactor(qreal zoomFactor)675 void QWKPage::setPageZoomFactor(qreal zoomFactor)
676 {
677 WKPageSetPageZoomFactor(pageRef(), zoomFactor);
678 }
679
setPageAndTextZoomFactors(qreal pageZoomFactor,qreal textZoomFactor)680 void QWKPage::setPageAndTextZoomFactors(qreal pageZoomFactor, qreal textZoomFactor)
681 {
682 WKPageSetPageAndTextZoomFactors(pageRef(), pageZoomFactor, textZoomFactor);
683 }
684
history() const685 QWKHistory* QWKPage::history() const
686 {
687 return d->history;
688 }
689
setResizesToContentsUsingLayoutSize(const QSize & targetLayoutSize)690 void QWKPage::setResizesToContentsUsingLayoutSize(const QSize& targetLayoutSize)
691 {
692 #if ENABLE(TILED_BACKING_STORE)
693 d->page->setResizesToContentsUsingLayoutSize(targetLayoutSize);
694 #endif
695 }
696
697 #ifndef QT_NO_ACTION
triggerAction(WebAction webAction,bool)698 void QWKPage::triggerAction(WebAction webAction, bool)
699 {
700 switch (webAction) {
701 case Back:
702 d->page->goBack();
703 return;
704 case Forward:
705 d->page->goForward();
706 return;
707 case Stop:
708 d->page->stopLoading();
709 return;
710 case Reload:
711 d->page->reload(/* reloadFromOrigin */ true);
712 return;
713 default:
714 break;
715 }
716
717 QAction* qtAction = action(webAction);
718 WebKit::WebContextMenuItemData menuItemData(ActionType, contextMenuActionForWebAction(webAction), qtAction->text(), qtAction->isEnabled(), qtAction->isChecked());
719 d->page->contextMenuItemSelected(menuItemData);
720 }
721 #endif // QT_NO_ACTION
722
723 #ifndef QT_NO_ACTION
action(WebAction action) const724 QAction* QWKPage::action(WebAction action) const
725 {
726 if (action == QWKPage::NoWebAction || action >= WebActionCount)
727 return 0;
728
729 if (d->actions[action])
730 return d->actions[action];
731
732 QString text;
733 QIcon icon;
734 QStyle* style = qobject_cast<QApplication*>(QCoreApplication::instance())->style();
735 bool checkable = false;
736
737 switch (action) {
738 case OpenLink:
739 text = contextMenuItemTagOpenLink();
740 break;
741 case OpenLinkInNewWindow:
742 text = contextMenuItemTagOpenLinkInNewWindow();
743 break;
744 case CopyLinkToClipboard:
745 text = contextMenuItemTagCopyLinkToClipboard();
746 break;
747 case OpenImageInNewWindow:
748 text = contextMenuItemTagOpenImageInNewWindow();
749 break;
750 case Back:
751 text = contextMenuItemTagGoBack();
752 icon = style->standardIcon(QStyle::SP_ArrowBack);
753 break;
754 case Forward:
755 text = contextMenuItemTagGoForward();
756 icon = style->standardIcon(QStyle::SP_ArrowForward);
757 break;
758 case Stop:
759 text = contextMenuItemTagStop();
760 icon = style->standardIcon(QStyle::SP_BrowserStop);
761 break;
762 case Reload:
763 text = contextMenuItemTagReload();
764 icon = style->standardIcon(QStyle::SP_BrowserReload);
765 break;
766 case Cut:
767 text = contextMenuItemTagCut();
768 break;
769 case Copy:
770 text = contextMenuItemTagCopy();
771 break;
772 case Paste:
773 text = contextMenuItemTagPaste();
774 break;
775 case SelectAll:
776 text = contextMenuItemTagSelectAll();
777 break;
778 default:
779 return 0;
780 break;
781 }
782
783 if (text.isEmpty())
784 return 0;
785
786 QAction* a = new QAction(d->q);
787 a->setText(text);
788 a->setData(action);
789 a->setCheckable(checkable);
790 a->setIcon(icon);
791
792 connect(a, SIGNAL(triggered(bool)), this, SLOT(_q_webActionTriggered(bool)));
793
794 d->actions[action] = a;
795 d->updateAction(action);
796 return a;
797 }
798 #endif // QT_NO_ACTION
799
findZoomableAreaForPoint(const QPoint & point)800 void QWKPage::findZoomableAreaForPoint(const QPoint& point)
801 {
802 d->page->findZoomableAreaForPoint(point);
803 }
804
didFindZoomableArea(const IntRect & area)805 void QWKPagePrivate::didFindZoomableArea(const IntRect& area)
806 {
807 emit q->zoomableAreaFound(QRect(area));
808 }
809
isConnectedToEngine() const810 bool QWKPage::isConnectedToEngine() const
811 {
812 return d->isConnectedToEngine;
813 }
814
815 #include "moc_qwkpage.cpp"
816