2 * Copyright (C) 2010, 2011 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
27 #include "WebPageProxy.h"
29 #include "AuthenticationChallengeProxy.h"
30 #include "AuthenticationDecisionListener.h"
31 #include "DataReference.h"
32 #include "DrawingAreaProxy.h"
33 #include "FindIndicator.h"
34 #include "MessageID.h"
35 #include "NativeWebKeyboardEvent.h"
36 #include "PageClient.h"
37 #include "PrintInfo.h"
38 #include "SessionState.h"
39 #include "StringPairVector.h"
40 #include "TextChecker.h"
41 #include "TextCheckerState.h"
42 #include "WKContextPrivate.h"
43 #include "WebBackForwardList.h"
44 #include "WebBackForwardListItem.h"
45 #include "WebCertificateInfo.h"
46 #include "WebContext.h"
47 #include "WebContextMenuProxy.h"
48 #include "WebContextUserMessageCoders.h"
49 #include "WebCoreArgumentCoders.h"
51 #include "WebEditCommandProxy.h"
53 #include "WebFormSubmissionListenerProxy.h"
54 #include "WebFramePolicyListenerProxy.h"
55 #include "WebOpenPanelResultListenerProxy.h"
56 #include "WebPageCreationParameters.h"
57 #include "WebPageGroup.h"
58 #include "WebPageGroupData.h"
59 #include "WebPageMessages.h"
60 #include "WebPopupItem.h"
61 #include "WebPopupMenuProxy.h"
62 #include "WebPreferences.h"
63 #include "WebProcessManager.h"
64 #include "WebProcessMessages.h"
65 #include "WebProcessProxy.h"
66 #include "WebProtectionSpace.h"
67 #include "WebSecurityOrigin.h"
68 #include "WebURLRequest.h"
70 #include "WebDragSource.h"
71 #include <WebCore/BitmapInfo.h>
72 #include <WebCore/COMPtr.h>
73 #include <WebCore/WCDataObject.h>
76 #include <WebCore/DragData.h>
77 #include <WebCore/FloatRect.h>
78 #include <WebCore/MIMETypeRegistry.h>
79 #include <WebCore/WindowFeatures.h>
83 #include <wtf/RefCountedLeakCounter.h>
86 // This controls what strategy we use for mouse wheel coalesing.
87 #define MERGE_WHEEL_EVENTS 0
89 #define MESSAGE_CHECK(assertion) MESSAGE_CHECK_BASE(assertion, process()->connection())
91 using namespace WebCore;
96 static WTF::RefCountedLeakCounter webPageProxyCounter("WebPageProxy");
99 PassRefPtr<WebPageProxy> WebPageProxy::create(PageClient* pageClient, WebContext* context, WebPageGroup* pageGroup, uint64_t pageID)
101 return adoptRef(new WebPageProxy(pageClient, context, pageGroup, pageID));
104 WebPageProxy::WebPageProxy(PageClient* pageClient, WebContext* context, WebPageGroup* pageGroup, uint64_t pageID)
105 : m_pageClient(pageClient)
107 , m_pageGroup(pageGroup)
109 , m_userAgent(standardUserAgent())
110 , m_geolocationPermissionRequestManager(this)
111 , m_estimatedProgress(0)
112 , m_isInWindow(m_pageClient->isViewInWindow())
113 , m_isVisible(m_pageClient->isViewVisible())
114 , m_backForwardList(WebBackForwardList::create(this))
115 , m_textZoomFactor(1)
116 , m_pageZoomFactor(1)
117 , m_viewScaleFactor(1)
118 , m_drawsBackground(true)
119 , m_drawsTransparentBackground(false)
120 , m_useFixedLayout(false)
123 , m_isInPrintingMode(false)
124 , m_isPerformingDOMPrintOperation(false)
125 , m_inDecidePolicyForMIMEType(false)
126 , m_syncMimeTypePolicyActionIsValid(false)
127 , m_syncMimeTypePolicyAction(PolicyUse)
128 , m_syncMimeTypePolicyDownloadID(0)
129 , m_inDecidePolicyForNavigationAction(false)
130 , m_syncNavigationActionPolicyActionIsValid(false)
131 , m_syncNavigationActionPolicyAction(PolicyUse)
132 , m_processingWheelEvent(false)
133 , m_processingMouseMoveEvent(false)
136 , m_isSmartInsertDeleteEnabled(TextChecker::isSmartInsertDeleteEnabled())
138 , m_spellDocumentTag(0)
139 , m_hasSpellDocumentTag(false)
140 , m_pendingLearnOrIgnoreWordMessageCount(0)
141 , m_mainFrameHasCustomRepresentation(false)
142 , m_currentDragOperation(DragOperationNone)
143 , m_mainFrameHasHorizontalScrollbar(false)
144 , m_mainFrameHasVerticalScrollbar(false)
147 webPageProxyCounter.increment();
150 WebContext::statistics().wkPageCount++;
152 m_pageGroup->addPage(this);
155 WebPageProxy::~WebPageProxy()
157 WebContext::statistics().wkPageCount--;
159 if (m_hasSpellDocumentTag)
160 TextChecker::closeSpellDocumentWithTag(m_spellDocumentTag);
162 m_pageGroup->removePage(this);
165 webPageProxyCounter.decrement();
169 WebProcessProxy* WebPageProxy::process() const
171 return m_context->process();
174 bool WebPageProxy::isValid()
176 // A page that has been explicitly closed is never valid.
183 void WebPageProxy::setDrawingArea(PassOwnPtr<DrawingAreaProxy> drawingArea)
185 if (drawingArea == m_drawingArea)
188 m_drawingArea = drawingArea;
191 void WebPageProxy::initializeLoaderClient(const WKPageLoaderClient* loadClient)
193 m_loaderClient.initialize(loadClient);
196 void WebPageProxy::initializePolicyClient(const WKPagePolicyClient* policyClient)
198 m_policyClient.initialize(policyClient);
201 void WebPageProxy::initializeFormClient(const WKPageFormClient* formClient)
203 m_formClient.initialize(formClient);
206 void WebPageProxy::initializeResourceLoadClient(const WKPageResourceLoadClient* client)
208 m_resourceLoadClient.initialize(client);
211 void WebPageProxy::initializeUIClient(const WKPageUIClient* client)
213 m_uiClient.initialize(client);
216 void WebPageProxy::initializeFindClient(const WKPageFindClient* client)
218 m_findClient.initialize(client);
221 void WebPageProxy::initializeContextMenuClient(const WKPageContextMenuClient* client)
223 m_contextMenuClient.initialize(client);
226 void WebPageProxy::reattachToWebProcess()
230 context()->relaunchProcessIfNecessary();
231 process()->addExistingWebPage(this, m_pageID);
235 m_pageClient->didRelaunchProcess();
238 void WebPageProxy::reattachToWebProcessWithItem(WebBackForwardListItem* item)
240 if (item && item != m_backForwardList->currentItem())
241 m_backForwardList->goToItem(item);
243 reattachToWebProcess();
248 SandboxExtension::Handle sandboxExtensionHandle;
249 initializeSandboxExtensionHandle(KURL(KURL(), item->url()), sandboxExtensionHandle);
250 process()->send(Messages::WebPage::GoToBackForwardItem(item->itemID(), sandboxExtensionHandle), m_pageID);
253 void WebPageProxy::initializeWebPage()
257 BackForwardListItemVector items = m_backForwardList->entries();
258 for (size_t i = 0; i < items.size(); ++i)
259 process()->registerNewWebBackForwardListItem(items[i].get());
261 m_drawingArea = m_pageClient->createDrawingAreaProxy();
262 ASSERT(m_drawingArea);
264 process()->send(Messages::WebProcess::CreateWebPage(m_pageID, creationParameters()), 0);
267 void WebPageProxy::close()
274 m_backForwardList->pageClosed();
275 m_pageClient->pageClosed();
277 process()->disconnectFramesFromPage(this);
280 #if ENABLE(INSPECTOR)
282 m_inspector->invalidate();
287 if (m_openPanelResultListener) {
288 m_openPanelResultListener->invalidate();
289 m_openPanelResultListener = 0;
292 m_geolocationPermissionRequestManager.invalidateRequests();
294 m_toolTip = String();
296 m_mainFrameHasHorizontalScrollbar = false;
297 m_mainFrameHasVerticalScrollbar = false;
299 invalidateCallbackMap(m_voidCallbacks);
300 invalidateCallbackMap(m_dataCallbacks);
301 invalidateCallbackMap(m_stringCallbacks);
302 invalidateCallbackMap(m_computedPagesCallbacks);
304 Vector<WebEditCommandProxy*> editCommandVector;
305 copyToVector(m_editCommandSet, editCommandVector);
306 m_editCommandSet.clear();
307 for (size_t i = 0, size = editCommandVector.size(); i < size; ++i)
308 editCommandVector[i]->invalidate();
310 m_activePopupMenu = 0;
312 m_estimatedProgress = 0.0;
314 m_loaderClient.initialize(0);
315 m_policyClient.initialize(0);
316 m_uiClient.initialize(0);
318 m_drawingArea.clear();
320 process()->send(Messages::WebPage::Close(), m_pageID);
321 process()->removeWebPage(m_pageID);
324 bool WebPageProxy::tryClose()
329 process()->send(Messages::WebPage::TryClose(), m_pageID);
333 void WebPageProxy::initializeSandboxExtensionHandle(const KURL& url, SandboxExtension::Handle& sandboxExtensionHandle)
335 if (!url.isLocalFile())
338 // Don't give the inspector full access to the file system.
339 if (WebInspectorProxy::isInspectorPage(this))
342 SandboxExtension::createHandle("/", SandboxExtension::ReadOnly, sandboxExtensionHandle);
345 void WebPageProxy::loadURL(const String& url)
347 setPendingAPIRequestURL(url);
350 reattachToWebProcess();
352 SandboxExtension::Handle sandboxExtensionHandle;
353 initializeSandboxExtensionHandle(KURL(KURL(), url), sandboxExtensionHandle);
354 process()->send(Messages::WebPage::LoadURL(url, sandboxExtensionHandle), m_pageID);
357 void WebPageProxy::loadURLRequest(WebURLRequest* urlRequest)
359 setPendingAPIRequestURL(urlRequest->resourceRequest().url());
362 reattachToWebProcess();
364 SandboxExtension::Handle sandboxExtensionHandle;
365 initializeSandboxExtensionHandle(urlRequest->resourceRequest().url(), sandboxExtensionHandle);
366 process()->send(Messages::WebPage::LoadURLRequest(urlRequest->resourceRequest(), sandboxExtensionHandle), m_pageID);
369 void WebPageProxy::loadHTMLString(const String& htmlString, const String& baseURL)
373 process()->send(Messages::WebPage::LoadHTMLString(htmlString, baseURL), m_pageID);
376 void WebPageProxy::loadAlternateHTMLString(const String& htmlString, const String& baseURL, const String& unreachableURL)
384 m_mainFrame->setUnreachableURL(unreachableURL);
385 process()->send(Messages::WebPage::LoadAlternateHTMLString(htmlString, baseURL, unreachableURL), m_pageID);
388 void WebPageProxy::loadPlainTextString(const String& string)
392 process()->send(Messages::WebPage::LoadPlainTextString(string), m_pageID);
395 void WebPageProxy::stopLoading()
399 process()->send(Messages::WebPage::StopLoading(), m_pageID);
402 void WebPageProxy::reload(bool reloadFromOrigin)
404 if (m_backForwardList->currentItem())
405 setPendingAPIRequestURL(m_backForwardList->currentItem()->url());
408 reattachToWebProcessWithItem(m_backForwardList->currentItem());
412 process()->send(Messages::WebPage::Reload(reloadFromOrigin), m_pageID);
415 void WebPageProxy::goForward()
417 if (isValid() && !canGoForward())
420 WebBackForwardListItem* forwardItem = m_backForwardList->forwardItem();
422 setPendingAPIRequestURL(forwardItem->url());
425 reattachToWebProcessWithItem(forwardItem);
429 SandboxExtension::Handle sandboxExtensionHandle;
430 initializeSandboxExtensionHandle(KURL(KURL(), forwardItem->url()), sandboxExtensionHandle);
431 process()->send(Messages::WebPage::GoForward(forwardItem->itemID(), sandboxExtensionHandle), m_pageID);
434 bool WebPageProxy::canGoForward() const
436 return m_backForwardList->forwardItem();
439 void WebPageProxy::goBack()
441 if (isValid() && !canGoBack())
444 WebBackForwardListItem* backItem = m_backForwardList->backItem();
446 setPendingAPIRequestURL(backItem->url());
449 reattachToWebProcessWithItem(backItem);
453 SandboxExtension::Handle sandboxExtensionHandle;
454 initializeSandboxExtensionHandle(KURL(KURL(), backItem->url()), sandboxExtensionHandle);
455 process()->send(Messages::WebPage::GoBack(backItem->itemID(), sandboxExtensionHandle), m_pageID);
458 bool WebPageProxy::canGoBack() const
460 return m_backForwardList->backItem();
463 void WebPageProxy::goToBackForwardItem(WebBackForwardListItem* item)
466 reattachToWebProcessWithItem(item);
470 SandboxExtension::Handle sandboxExtensionHandle;
471 initializeSandboxExtensionHandle(KURL(KURL(), item->url()), sandboxExtensionHandle);
472 process()->send(Messages::WebPage::GoToBackForwardItem(item->itemID(), sandboxExtensionHandle), m_pageID);
475 void WebPageProxy::didChangeBackForwardList(WebBackForwardListItem* added, Vector<RefPtr<APIObject> >* removed)
477 m_loaderClient.didChangeBackForwardList(this, added, removed);
481 bool WebPageProxy::canShowMIMEType(const String& mimeType) const
483 if (MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType))
486 if (MIMETypeRegistry::isSupportedImageMIMEType(mimeType))
489 String newMimeType = mimeType;
490 PluginInfoStore::Plugin plugin = context()->pluginInfoStore()->findPlugin(newMimeType, KURL());
491 if (!plugin.path.isNull())
497 void WebPageProxy::setDrawsBackground(bool drawsBackground)
499 if (m_drawsBackground == drawsBackground)
502 m_drawsBackground = drawsBackground;
505 process()->send(Messages::WebPage::SetDrawsBackground(drawsBackground), m_pageID);
508 void WebPageProxy::setDrawsTransparentBackground(bool drawsTransparentBackground)
510 if (m_drawsTransparentBackground == drawsTransparentBackground)
513 m_drawsTransparentBackground = drawsTransparentBackground;
516 process()->send(Messages::WebPage::SetDrawsTransparentBackground(drawsTransparentBackground), m_pageID);
519 void WebPageProxy::viewWillStartLiveResize()
521 process()->send(Messages::WebPage::ViewWillStartLiveResize(), m_pageID);
524 void WebPageProxy::viewWillEndLiveResize()
526 process()->send(Messages::WebPage::ViewWillEndLiveResize(), m_pageID);
529 void WebPageProxy::setViewNeedsDisplay(const IntRect& rect)
531 m_pageClient->setViewNeedsDisplay(rect);
534 void WebPageProxy::displayView()
536 m_pageClient->displayView();
539 void WebPageProxy::scrollView(const IntRect& scrollRect, const IntSize& scrollOffset)
541 m_pageClient->scrollView(scrollRect, scrollOffset);
544 void WebPageProxy::viewStateDidChange(ViewStateFlags flags)
549 if (flags & ViewIsFocused)
550 process()->send(Messages::WebPage::SetFocused(m_pageClient->isViewFocused()), m_pageID);
552 if (flags & ViewWindowIsActive)
553 process()->send(Messages::WebPage::SetActive(m_pageClient->isViewWindowActive()), m_pageID);
555 if (flags & ViewIsVisible) {
556 bool isVisible = m_pageClient->isViewVisible();
557 if (isVisible != m_isVisible) {
558 m_isVisible = isVisible;
559 m_drawingArea->visibilityDidChange();
560 m_drawingArea->setPageIsVisible(isVisible);
564 if (flags & ViewIsInWindow) {
565 bool isInWindow = m_pageClient->isViewInWindow();
566 if (m_isInWindow != isInWindow) {
567 m_isInWindow = isInWindow;
568 process()->send(Messages::WebPage::SetIsInWindow(isInWindow), m_pageID);
573 IntSize WebPageProxy::viewSize() const
575 return m_pageClient->viewSize();
578 void WebPageProxy::setInitialFocus(bool forward)
582 process()->send(Messages::WebPage::SetInitialFocus(forward), m_pageID);
585 void WebPageProxy::setWindowResizerSize(const IntSize& windowResizerSize)
589 process()->send(Messages::WebPage::SetWindowResizerSize(windowResizerSize), m_pageID);
592 void WebPageProxy::validateMenuItem(const String& commandName)
596 process()->send(Messages::WebPage::ValidateMenuItem(commandName), m_pageID);
599 void WebPageProxy::executeEditCommand(const String& commandName)
604 process()->send(Messages::WebPage::ExecuteEditCommand(commandName), m_pageID);
608 void WebPageProxy::updateWindowIsVisible(bool windowIsVisible)
612 process()->send(Messages::WebPage::SetWindowIsVisible(windowIsVisible), m_pageID);
615 void WebPageProxy::windowAndViewFramesChanged(const IntRect& windowFrameInScreenCoordinates, const IntRect& viewFrameInWindowCoordinates, const IntPoint& accessibilityViewCoordinates)
620 process()->send(Messages::WebPage::WindowAndViewFramesChanged(windowFrameInScreenCoordinates, viewFrameInWindowCoordinates, accessibilityViewCoordinates), m_pageID);
623 void WebPageProxy::getMarkedRange(uint64_t& location, uint64_t& length)
625 process()->sendSync(Messages::WebPage::GetMarkedRange(), Messages::WebPage::GetMarkedRange::Reply(location, length), m_pageID);
628 uint64_t WebPageProxy::characterIndexForPoint(const IntPoint point)
631 process()->sendSync(Messages::WebPage::CharacterIndexForPoint(point), Messages::WebPage::CharacterIndexForPoint::Reply(result), m_pageID);
635 WebCore::IntRect WebPageProxy::firstRectForCharacterRange(uint64_t location, uint64_t length)
638 process()->sendSync(Messages::WebPage::FirstRectForCharacterRange(location, length), Messages::WebPage::FirstRectForCharacterRange::Reply(resultRect), m_pageID);
642 WebCore::IntRect WebPageProxy::firstRectForCharacterInSelectedRange(int characterPosition)
645 process()->sendSync(Messages::WebPage::FirstRectForCharacterInSelectedRange(characterPosition), Messages::WebPage::FirstRectForCharacterInSelectedRange::Reply(resultRect), m_pageID);
649 String WebPageProxy::getSelectedText()
652 process()->sendSync(Messages::WebPage::GetSelectedText(), Messages::WebPage::GetSelectedText::Reply(text), m_pageID);
657 #if ENABLE(TILED_BACKING_STORE)
658 void WebPageProxy::setActualVisibleContentRect(const IntRect& rect)
663 process()->send(Messages::WebPage::SetActualVisibleContentRect(rect), m_pageID);
667 void WebPageProxy::performDragControllerAction(DragControllerAction action, WebCore::DragData* dragData, const String& dragStorageName)
672 // FIXME: We should pass the drag data map only on DragEnter.
673 process()->send(Messages::WebPage::PerformDragControllerAction(action, dragData->clientPosition(), dragData->globalPosition(),
674 dragData->draggingSourceOperationMask(), dragData->dragDataMap(), dragData->flags()), m_pageID);
676 process()->send(Messages::WebPage::PerformDragControllerAction(action, dragData->clientPosition(), dragData->globalPosition(), dragData->draggingSourceOperationMask(), dragStorageName, dragData->flags()), m_pageID);
680 void WebPageProxy::didPerformDragControllerAction(uint64_t resultOperation)
682 m_currentDragOperation = static_cast<DragOperation>(resultOperation);
686 void WebPageProxy::setDragImage(const WebCore::IntPoint& clientPosition, const IntSize& imageSize, const SharedMemory::Handle& dragImageHandle, bool isLinkDrag)
688 RefPtr<ShareableBitmap> dragImage = ShareableBitmap::create(imageSize, dragImageHandle);
692 m_pageClient->setDragImage(clientPosition, imageSize, dragImage.release(), isLinkDrag);
698 void WebPageProxy::startDragDrop(const IntPoint& imageOrigin, const IntPoint& dragPoint, uint64_t okEffect,
699 const HashMap<UINT, Vector<String> >& dataMap, const IntSize& dragImageSize, const SharedMemory::Handle& dragImageHandle, bool isLinkDrag)
701 COMPtr<WCDataObject> dataObject;
702 WCDataObject::createInstance(&dataObject, dataMap);
704 RefPtr<SharedMemory> memoryBuffer = SharedMemory::create(dragImageHandle, SharedMemory::ReadOnly);
708 RefPtr<WebDragSource> source = WebDragSource::createInstance();
712 COMPtr<IDragSourceHelper> helper;
713 if (FAILED(::CoCreateInstance(CLSID_DragDropHelper, 0, CLSCTX_INPROC_SERVER, IID_IDragSourceHelper, reinterpret_cast<LPVOID*>(&helper))))
716 BitmapInfo bitmapInfo = BitmapInfo::create(dragImageSize);
718 OwnPtr<HBITMAP> hbmp(::CreateDIBSection(0, &bitmapInfo, DIB_RGB_COLORS, &bits, 0, 0));
719 memcpy(bits, memoryBuffer->data(), memoryBuffer->size());
722 sdi.sizeDragImage.cx = bitmapInfo.bmiHeader.biWidth;
723 sdi.sizeDragImage.cy = bitmapInfo.bmiHeader.biHeight;
724 sdi.crColorKey = 0xffffffff;
725 sdi.hbmpDragImage = hbmp.leakPtr();
726 sdi.ptOffset.x = dragPoint.x() - imageOrigin.x();
727 sdi.ptOffset.y = dragPoint.y() - imageOrigin.y();
729 sdi.ptOffset.y = bitmapInfo.bmiHeader.biHeight - sdi.ptOffset.y;
731 helper->InitializeFromBitmap(&sdi, dataObject.get());
733 DWORD effect = DROPEFFECT_NONE;
735 DragOperation operation = DragOperationNone;
736 if (::DoDragDrop(dataObject.get(), source.get(), okEffect, &effect) == DRAGDROP_S_DROP) {
737 if (effect & DROPEFFECT_COPY)
738 operation = DragOperationCopy;
739 else if (effect & DROPEFFECT_LINK)
740 operation = DragOperationLink;
741 else if (effect & DROPEFFECT_MOVE)
742 operation = DragOperationMove;
745 ::GetCursorPos(&globalPoint);
746 POINT localPoint = globalPoint;
747 ::ScreenToClient(m_pageClient->nativeWindow(), &localPoint);
749 dragEnded(localPoint, globalPoint, operation);
753 void WebPageProxy::dragEnded(const WebCore::IntPoint& clientPosition, const WebCore::IntPoint& globalPosition, uint64_t operation)
757 process()->send(Messages::WebPage::DragEnded(clientPosition, globalPosition, operation), m_pageID);
760 void WebPageProxy::handleMouseEvent(const WebMouseEvent& event)
765 // NOTE: This does not start the responsiveness timer because mouse move should not indicate interaction.
766 if (event.type() != WebEvent::MouseMove)
767 process()->responsivenessTimer()->start();
769 if (m_processingMouseMoveEvent) {
770 m_nextMouseMoveEvent = adoptPtr(new WebMouseEvent(event));
774 m_processingMouseMoveEvent = true;
777 process()->send(Messages::WebPage::MouseEvent(event), m_pageID);
780 static PassOwnPtr<WebWheelEvent> coalesceWheelEvents(WebWheelEvent* oldNextWheelEvent, const WebWheelEvent& newWheelEvent)
782 #if MERGE_WHEEL_EVENTS
783 // Merge model: Combine wheel event deltas (and wheel ticks) into a single wheel event.
784 if (!oldNextWheelEvent)
785 return adoptPtr(new WebWheelEvent(newWheelEvent));
787 if (oldNextWheelEvent->position() != newWheelEvent.position() || oldNextWheelEvent->modifiers() != newWheelEvent.modifiers() || oldNextWheelEvent->granularity() != newWheelEvent.granularity())
788 return adoptPtr(new WebWheelEvent(newWheelEvent));
790 FloatSize mergedDelta = oldNextWheelEvent->delta() + newWheelEvent.delta();
791 FloatSize mergedWheelTicks = oldNextWheelEvent->wheelTicks() + newWheelEvent.wheelTicks();
793 return adoptPtr(new WebWheelEvent(WebEvent::Wheel, newWheelEvent.position(), newWheelEvent.globalPosition(), mergedDelta, mergedWheelTicks, newWheelEvent.granularity(), newWheelEvent.modifiers(), newWheelEvent.timestamp()));
795 // Simple model: Just keep the last event, dropping all interim events.
796 return adoptPtr(new WebWheelEvent(newWheelEvent));
800 void WebPageProxy::handleWheelEvent(const WebWheelEvent& event)
805 if (m_processingWheelEvent) {
806 m_nextWheelEvent = coalesceWheelEvents(m_nextWheelEvent.get(), event);
810 process()->responsivenessTimer()->start();
811 process()->send(Messages::WebPage::WheelEvent(event), m_pageID);
812 m_processingWheelEvent = true;
815 void WebPageProxy::handleKeyboardEvent(const NativeWebKeyboardEvent& event)
820 m_keyEventQueue.append(event);
822 process()->responsivenessTimer()->start();
823 process()->send(Messages::WebPage::KeyEvent(event), m_pageID);
826 #if ENABLE(GESTURE_EVENTS)
827 void WebPageProxy::handleGestureEvent(const WebGestureEvent& event)
832 process()->responsivenessTimer()->start();
833 process()->send(Messages::WebPage::GestureEvent(event), m_pageID);
837 #if ENABLE(TOUCH_EVENTS)
838 void WebPageProxy::handleTouchEvent(const WebTouchEvent& event)
842 process()->send(Messages::WebPage::TouchEvent(event), m_pageID);
846 void WebPageProxy::receivedPolicyDecision(PolicyAction action, WebFrameProxy* frame, uint64_t listenerID)
851 uint64_t downloadID = 0;
852 if (action == PolicyDownload) {
853 // Create a download proxy.
854 downloadID = context()->createDownloadProxy();
857 // If we received a policy decision while in decidePolicyForMIMEType the decision will
858 // be sent back to the web process by decidePolicyForMIMEType.
859 if (m_inDecidePolicyForMIMEType) {
860 m_syncMimeTypePolicyActionIsValid = true;
861 m_syncMimeTypePolicyAction = action;
862 m_syncMimeTypePolicyDownloadID = downloadID;
866 // If we received a policy decision while in decidePolicyForNavigationAction the decision will
867 // be sent back to the web process by decidePolicyForNavigationAction.
868 if (m_inDecidePolicyForNavigationAction) {
869 m_syncNavigationActionPolicyActionIsValid = true;
870 m_syncNavigationActionPolicyAction = action;
874 process()->send(Messages::WebPage::DidReceivePolicyDecision(frame->frameID(), listenerID, action, downloadID), m_pageID);
877 String WebPageProxy::pageTitle() const
879 // Return the null string if there is no main frame (e.g. nothing has been loaded in the page yet, WebProcess has
880 // crashed, page has been closed).
884 return m_mainFrame->title();
887 void WebPageProxy::setUserAgent(const String& userAgent)
889 if (m_userAgent == userAgent)
891 m_userAgent = userAgent;
895 process()->send(Messages::WebPage::SetUserAgent(m_userAgent), m_pageID);
898 void WebPageProxy::setApplicationNameForUserAgent(const String& applicationName)
900 if (m_applicationNameForUserAgent == applicationName)
903 m_applicationNameForUserAgent = applicationName;
904 if (!m_customUserAgent.isEmpty())
907 setUserAgent(standardUserAgent(m_applicationNameForUserAgent));
910 void WebPageProxy::setCustomUserAgent(const String& customUserAgent)
912 if (m_customUserAgent == customUserAgent)
915 m_customUserAgent = customUserAgent;
917 if (m_customUserAgent.isEmpty()) {
918 setUserAgent(standardUserAgent(m_applicationNameForUserAgent));
922 setUserAgent(m_customUserAgent);
925 bool WebPageProxy::supportsTextEncoding() const
927 return !m_mainFrameHasCustomRepresentation && m_mainFrame && !m_mainFrame->isDisplayingStandaloneImageDocument();
930 void WebPageProxy::setCustomTextEncodingName(const String& encodingName)
932 if (m_customTextEncodingName == encodingName)
934 m_customTextEncodingName = encodingName;
938 process()->send(Messages::WebPage::SetCustomTextEncodingName(encodingName), m_pageID);
941 void WebPageProxy::terminateProcess()
946 process()->terminate();
949 #if !PLATFORM(CF) || defined(BUILDING_QT__)
950 PassRefPtr<WebData> WebPageProxy::sessionStateData(WebPageProxySessionStateFilterCallback, void* context) const
952 // FIXME: Return session state data for saving Page state.
956 void WebPageProxy::restoreFromSessionStateData(WebData*)
958 // FIXME: Restore the Page from the passed in session state data.
962 bool WebPageProxy::supportsTextZoom() const
964 if (m_mainFrameHasCustomRepresentation)
967 // FIXME: This should also return false for standalone media and plug-in documents.
968 if (!m_mainFrame || m_mainFrame->isDisplayingStandaloneImageDocument())
974 void WebPageProxy::setTextZoomFactor(double zoomFactor)
979 if (m_mainFrameHasCustomRepresentation)
982 if (m_textZoomFactor == zoomFactor)
985 m_textZoomFactor = zoomFactor;
986 process()->send(Messages::WebPage::SetTextZoomFactor(m_textZoomFactor), m_pageID);
989 double WebPageProxy::pageZoomFactor() const
991 return m_mainFrameHasCustomRepresentation ? m_pageClient->customRepresentationZoomFactor() : m_pageZoomFactor;
994 void WebPageProxy::setPageZoomFactor(double zoomFactor)
999 if (m_mainFrameHasCustomRepresentation) {
1000 m_pageClient->setCustomRepresentationZoomFactor(zoomFactor);
1004 if (m_pageZoomFactor == zoomFactor)
1007 m_pageZoomFactor = zoomFactor;
1008 process()->send(Messages::WebPage::SetPageZoomFactor(m_pageZoomFactor), m_pageID);
1011 void WebPageProxy::setPageAndTextZoomFactors(double pageZoomFactor, double textZoomFactor)
1016 if (m_mainFrameHasCustomRepresentation) {
1017 m_pageClient->setCustomRepresentationZoomFactor(pageZoomFactor);
1021 if (m_pageZoomFactor == pageZoomFactor && m_textZoomFactor == textZoomFactor)
1024 m_pageZoomFactor = pageZoomFactor;
1025 m_textZoomFactor = textZoomFactor;
1026 process()->send(Messages::WebPage::SetPageAndTextZoomFactors(m_pageZoomFactor, m_textZoomFactor), m_pageID);
1029 void WebPageProxy::scaleWebView(double scale, const IntPoint& origin)
1034 process()->send(Messages::WebPage::ScaleWebView(scale, origin), m_pageID);
1037 void WebPageProxy::setUseFixedLayout(bool fixed)
1042 if (fixed == m_useFixedLayout)
1045 m_useFixedLayout = fixed;
1047 m_fixedLayoutSize = IntSize();
1048 process()->send(Messages::WebPage::SetUseFixedLayout(fixed), m_pageID);
1051 void WebPageProxy::setFixedLayoutSize(const IntSize& size)
1056 if (size == m_fixedLayoutSize)
1059 m_fixedLayoutSize = size;
1060 process()->send(Messages::WebPage::SetFixedLayoutSize(size), m_pageID);
1063 void WebPageProxy::viewScaleFactorDidChange(double scaleFactor)
1065 m_viewScaleFactor = scaleFactor;
1068 void WebPageProxy::findString(const String& string, FindOptions options, unsigned maxMatchCount)
1070 process()->send(Messages::WebPage::FindString(string, options, maxMatchCount), m_pageID);
1073 void WebPageProxy::hideFindUI()
1075 process()->send(Messages::WebPage::HideFindUI(), m_pageID);
1078 void WebPageProxy::countStringMatches(const String& string, FindOptions options, unsigned maxMatchCount)
1080 process()->send(Messages::WebPage::CountStringMatches(string, options, maxMatchCount), m_pageID);
1083 void WebPageProxy::runJavaScriptInMainFrame(const String& script, PassRefPtr<StringCallback> prpCallback)
1085 RefPtr<StringCallback> callback = prpCallback;
1086 uint64_t callbackID = callback->callbackID();
1087 m_stringCallbacks.set(callbackID, callback.get());
1088 process()->send(Messages::WebPage::RunJavaScriptInMainFrame(script, callbackID), m_pageID);
1091 void WebPageProxy::getRenderTreeExternalRepresentation(PassRefPtr<StringCallback> prpCallback)
1093 RefPtr<StringCallback> callback = prpCallback;
1094 uint64_t callbackID = callback->callbackID();
1095 m_stringCallbacks.set(callbackID, callback.get());
1096 process()->send(Messages::WebPage::GetRenderTreeExternalRepresentation(callbackID), m_pageID);
1099 void WebPageProxy::getSourceForFrame(WebFrameProxy* frame, PassRefPtr<StringCallback> prpCallback)
1101 RefPtr<StringCallback> callback = prpCallback;
1102 uint64_t callbackID = callback->callbackID();
1103 m_stringCallbacks.set(callbackID, callback.get());
1104 process()->send(Messages::WebPage::GetSourceForFrame(frame->frameID(), callbackID), m_pageID);
1107 void WebPageProxy::getContentsAsString(PassRefPtr<StringCallback> prpCallback)
1109 RefPtr<StringCallback> callback = prpCallback;
1110 uint64_t callbackID = callback->callbackID();
1111 m_stringCallbacks.set(callbackID, callback.get());
1112 process()->send(Messages::WebPage::GetContentsAsString(callbackID), m_pageID);
1115 void WebPageProxy::getSelectionOrContentsAsString(PassRefPtr<StringCallback> prpCallback)
1117 RefPtr<StringCallback> callback = prpCallback;
1118 uint64_t callbackID = callback->callbackID();
1119 m_stringCallbacks.set(callbackID, callback.get());
1120 process()->send(Messages::WebPage::GetSelectionOrContentsAsString(callbackID), m_pageID);
1123 void WebPageProxy::getMainResourceDataOfFrame(WebFrameProxy* frame, PassRefPtr<DataCallback> prpCallback)
1125 RefPtr<DataCallback> callback = prpCallback;
1126 uint64_t callbackID = callback->callbackID();
1127 m_dataCallbacks.set(callbackID, callback.get());
1128 process()->send(Messages::WebPage::GetMainResourceDataOfFrame(frame->frameID(), callbackID), m_pageID);
1131 void WebPageProxy::getResourceDataFromFrame(WebFrameProxy* frame, WebURL* resourceURL, PassRefPtr<DataCallback> prpCallback)
1133 RefPtr<DataCallback> callback = prpCallback;
1134 uint64_t callbackID = callback->callbackID();
1135 m_dataCallbacks.set(callbackID, callback.get());
1136 process()->send(Messages::WebPage::GetResourceDataFromFrame(frame->frameID(), resourceURL->string(), callbackID), m_pageID);
1139 void WebPageProxy::getWebArchiveOfFrame(WebFrameProxy* frame, PassRefPtr<DataCallback> prpCallback)
1141 RefPtr<DataCallback> callback = prpCallback;
1142 uint64_t callbackID = callback->callbackID();
1143 m_dataCallbacks.set(callbackID, callback.get());
1144 process()->send(Messages::WebPage::GetWebArchiveOfFrame(frame->frameID(), callbackID), m_pageID);
1147 void WebPageProxy::forceRepaint(PassRefPtr<VoidCallback> prpCallback)
1149 RefPtr<VoidCallback> callback = prpCallback;
1152 callback->invalidate();
1156 uint64_t callbackID = callback->callbackID();
1157 m_voidCallbacks.set(callbackID, callback.get());
1158 process()->send(Messages::WebPage::ForceRepaint(callbackID), m_pageID);
1161 void WebPageProxy::preferencesDidChange()
1166 // FIXME: It probably makes more sense to send individual preference changes.
1167 // However, WebKitTestRunner depends on getting a preference change notification
1168 // even if nothing changed in UI process, so that overrides get removed.
1169 process()->send(Messages::WebPage::PreferencesDidChange(pageGroup()->preferences()->store()), m_pageID);
1172 #if ENABLE(TILED_BACKING_STORE)
1173 void WebPageProxy::setResizesToContentsUsingLayoutSize(const WebCore::IntSize& targetLayoutSize)
1175 process()->send(Messages::WebPage::SetResizesToContentsUsingLayoutSize(targetLayoutSize), m_pageID);
1179 void WebPageProxy::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments)
1181 #if PLATFORM(MAC) || PLATFORM(WIN)
1182 if (messageID.is<CoreIPC::MessageClassDrawingAreaProxy>()) {
1183 m_drawingArea->didReceiveDrawingAreaProxyMessage(connection, messageID, arguments);
1188 if (messageID.is<CoreIPC::MessageClassDrawingAreaProxyLegacy>()) {
1189 m_drawingArea->didReceiveMessage(connection, messageID, arguments);
1193 #if ENABLE(INSPECTOR)
1194 if (messageID.is<CoreIPC::MessageClassWebInspectorProxy>()) {
1195 if (WebInspectorProxy* inspector = this->inspector())
1196 inspector->didReceiveWebInspectorProxyMessage(connection, messageID, arguments);
1201 didReceiveWebPageProxyMessage(connection, messageID, arguments);
1204 void WebPageProxy::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments, CoreIPC::ArgumentEncoder* reply)
1206 if (messageID.is<CoreIPC::MessageClassDrawingAreaProxyLegacy>()) {
1207 m_drawingArea->didReceiveSyncMessage(connection, messageID, arguments, reply);
1211 #if ENABLE(INSPECTOR)
1212 if (messageID.is<CoreIPC::MessageClassWebInspectorProxy>()) {
1213 if (WebInspectorProxy* inspector = this->inspector())
1214 inspector->didReceiveSyncWebInspectorProxyMessage(connection, messageID, arguments, reply);
1219 // FIXME: Do something with reply.
1220 didReceiveSyncWebPageProxyMessage(connection, messageID, arguments, reply);
1224 void WebPageProxy::interpretKeyEvent(uint32_t type, Vector<KeypressCommand>& commandsList, uint32_t selectionStart, uint32_t selectionEnd, Vector<CompositionUnderline>& underlines)
1226 m_pageClient->interceptKeyEvent(m_keyEventQueue.first(), commandsList, selectionStart, selectionEnd, underlines);
1230 void WebPageProxy::didCreateMainFrame(uint64_t frameID)
1232 MESSAGE_CHECK(!m_mainFrame);
1233 MESSAGE_CHECK(process()->canCreateFrame(frameID));
1235 m_mainFrame = WebFrameProxy::create(this, frameID);
1237 // Add the frame to the process wide map.
1238 process()->frameCreated(frameID, m_mainFrame.get());
1241 void WebPageProxy::didCreateSubframe(uint64_t frameID, uint64_t parentFrameID)
1243 MESSAGE_CHECK(m_mainFrame);
1245 WebFrameProxy* parentFrame = process()->webFrame(parentFrameID);
1246 MESSAGE_CHECK(parentFrame);
1247 MESSAGE_CHECK(parentFrame->isDescendantOf(m_mainFrame.get()));
1249 MESSAGE_CHECK(process()->canCreateFrame(frameID));
1251 RefPtr<WebFrameProxy> subFrame = WebFrameProxy::create(this, frameID);
1253 // Add the frame to the process wide map.
1254 process()->frameCreated(frameID, subFrame.get());
1256 // Insert the frame into the frame hierarchy.
1257 parentFrame->appendChild(subFrame.get());
1260 static bool isDisconnectedFrame(WebFrameProxy* frame)
1262 return !frame->page() || !frame->page()->mainFrame() || !frame->isDescendantOf(frame->page()->mainFrame());
1265 void WebPageProxy::didSaveFrameToPageCache(uint64_t frameID)
1267 MESSAGE_CHECK(m_mainFrame);
1269 WebFrameProxy* subframe = process()->webFrame(frameID);
1270 MESSAGE_CHECK(subframe);
1272 if (isDisconnectedFrame(subframe))
1275 MESSAGE_CHECK(subframe->isDescendantOf(m_mainFrame.get()));
1277 subframe->didRemoveFromHierarchy();
1280 void WebPageProxy::didRestoreFrameFromPageCache(uint64_t frameID, uint64_t parentFrameID)
1282 MESSAGE_CHECK(m_mainFrame);
1284 WebFrameProxy* subframe = process()->webFrame(frameID);
1285 MESSAGE_CHECK(subframe);
1286 MESSAGE_CHECK(!subframe->parentFrame());
1287 MESSAGE_CHECK(subframe->page() == m_mainFrame->page());
1289 WebFrameProxy* parentFrame = process()->webFrame(parentFrameID);
1290 MESSAGE_CHECK(parentFrame);
1291 MESSAGE_CHECK(parentFrame->isDescendantOf(m_mainFrame.get()));
1293 // Insert the frame into the frame hierarchy.
1294 parentFrame->appendChild(subframe);
1298 // Always start progress at initialProgressValue. This helps provide feedback as
1299 // soon as a load starts.
1301 static const double initialProgressValue = 0.1;
1303 double WebPageProxy::estimatedProgress() const
1305 if (!pendingAPIRequestURL().isNull())
1306 return initialProgressValue;
1307 return m_estimatedProgress;
1310 void WebPageProxy::didStartProgress()
1312 m_estimatedProgress = initialProgressValue;
1314 m_loaderClient.didStartProgress(this);
1317 void WebPageProxy::didChangeProgress(double value)
1319 m_estimatedProgress = value;
1321 m_loaderClient.didChangeProgress(this);
1324 void WebPageProxy::didFinishProgress()
1326 m_estimatedProgress = 1.0;
1328 m_loaderClient.didFinishProgress(this);
1331 void WebPageProxy::didStartProvisionalLoadForFrame(uint64_t frameID, const String& url, bool loadingSubstituteDataForUnreachableURL, CoreIPC::ArgumentDecoder* arguments)
1333 clearPendingAPIRequestURL();
1335 RefPtr<APIObject> userData;
1336 WebContextUserMessageDecoder messageDecoder(userData, context());
1337 if (!arguments->decode(messageDecoder))
1340 WebFrameProxy* frame = process()->webFrame(frameID);
1341 MESSAGE_CHECK(frame);
1343 if (!loadingSubstituteDataForUnreachableURL)
1344 frame->setUnreachableURL(String());
1346 frame->didStartProvisionalLoad(url);
1347 m_loaderClient.didStartProvisionalLoadForFrame(this, frame, userData.get());
1350 void WebPageProxy::didReceiveServerRedirectForProvisionalLoadForFrame(uint64_t frameID, const String& url, CoreIPC::ArgumentDecoder* arguments)
1352 RefPtr<APIObject> userData;
1353 WebContextUserMessageDecoder messageDecoder(userData, context());
1354 if (!arguments->decode(messageDecoder))
1357 WebFrameProxy* frame = process()->webFrame(frameID);
1358 MESSAGE_CHECK(frame);
1360 frame->didReceiveServerRedirectForProvisionalLoad(url);
1362 m_loaderClient.didReceiveServerRedirectForProvisionalLoadForFrame(this, frame, userData.get());
1365 void WebPageProxy::didFailProvisionalLoadForFrame(uint64_t frameID, const ResourceError& error, CoreIPC::ArgumentDecoder* arguments)
1367 RefPtr<APIObject> userData;
1368 WebContextUserMessageDecoder messageDecoder(userData, context());
1369 if (!arguments->decode(messageDecoder))
1372 WebFrameProxy* frame = process()->webFrame(frameID);
1373 MESSAGE_CHECK(frame);
1375 frame->didFailProvisionalLoad();
1377 m_loaderClient.didFailProvisionalLoadWithErrorForFrame(this, frame, error, userData.get());
1380 void WebPageProxy::didCommitLoadForFrame(uint64_t frameID, const String& mimeType, bool frameHasCustomRepresentation, const PlatformCertificateInfo& certificateInfo, CoreIPC::ArgumentDecoder* arguments)
1382 RefPtr<APIObject> userData;
1383 WebContextUserMessageDecoder messageDecoder(userData, context());
1384 if (!arguments->decode(messageDecoder))
1387 WebFrameProxy* frame = process()->webFrame(frameID);
1388 MESSAGE_CHECK(frame);
1390 frame->didCommitLoad(mimeType, certificateInfo);
1392 if (frame->isMainFrame()) {
1393 m_mainFrameHasCustomRepresentation = frameHasCustomRepresentation;
1394 m_pageClient->didCommitLoadForMainFrame(frameHasCustomRepresentation);
1397 m_loaderClient.didCommitLoadForFrame(this, frame, userData.get());
1400 void WebPageProxy::didFinishDocumentLoadForFrame(uint64_t frameID, CoreIPC::ArgumentDecoder* arguments)
1402 RefPtr<APIObject> userData;
1403 WebContextUserMessageDecoder messageDecoder(userData, context());
1404 if (!arguments->decode(messageDecoder))
1407 WebFrameProxy* frame = process()->webFrame(frameID);
1408 MESSAGE_CHECK(frame);
1410 m_loaderClient.didFinishDocumentLoadForFrame(this, frame, userData.get());
1413 void WebPageProxy::didFinishLoadForFrame(uint64_t frameID, CoreIPC::ArgumentDecoder* arguments)
1415 RefPtr<APIObject> userData;
1416 WebContextUserMessageDecoder messageDecoder(userData, context());
1417 if (!arguments->decode(messageDecoder))
1420 WebFrameProxy* frame = process()->webFrame(frameID);
1421 MESSAGE_CHECK(frame);
1423 frame->didFinishLoad();
1425 m_loaderClient.didFinishLoadForFrame(this, frame, userData.get());
1428 void WebPageProxy::didFailLoadForFrame(uint64_t frameID, const ResourceError& error, CoreIPC::ArgumentDecoder* arguments)
1430 RefPtr<APIObject> userData;
1431 WebContextUserMessageDecoder messageDecoder(userData, context());
1432 if (!arguments->decode(messageDecoder))
1435 WebFrameProxy* frame = process()->webFrame(frameID);
1436 MESSAGE_CHECK(frame);
1438 frame->didFailLoad();
1440 m_loaderClient.didFailLoadWithErrorForFrame(this, frame, error, userData.get());
1443 void WebPageProxy::didSameDocumentNavigationForFrame(uint64_t frameID, uint32_t opaqueSameDocumentNavigationType, const String& url, CoreIPC::ArgumentDecoder* arguments)
1445 RefPtr<APIObject> userData;
1446 WebContextUserMessageDecoder messageDecoder(userData, context());
1447 if (!arguments->decode(messageDecoder))
1450 WebFrameProxy* frame = process()->webFrame(frameID);
1451 MESSAGE_CHECK(frame);
1453 frame->didSameDocumentNavigation(url);
1455 m_loaderClient.didSameDocumentNavigationForFrame(this, frame, static_cast<SameDocumentNavigationType>(opaqueSameDocumentNavigationType), userData.get());
1458 void WebPageProxy::didReceiveTitleForFrame(uint64_t frameID, const String& title, CoreIPC::ArgumentDecoder* arguments)
1460 RefPtr<APIObject> userData;
1461 WebContextUserMessageDecoder messageDecoder(userData, context());
1462 if (!arguments->decode(messageDecoder))
1465 WebFrameProxy* frame = process()->webFrame(frameID);
1466 MESSAGE_CHECK(frame);
1468 frame->didChangeTitle(title);
1470 m_loaderClient.didReceiveTitleForFrame(this, title, frame, userData.get());
1473 void WebPageProxy::didFirstLayoutForFrame(uint64_t frameID, CoreIPC::ArgumentDecoder* arguments)
1475 RefPtr<APIObject> userData;
1476 WebContextUserMessageDecoder messageDecoder(userData, context());
1477 if (!arguments->decode(messageDecoder))
1480 WebFrameProxy* frame = process()->webFrame(frameID);
1481 MESSAGE_CHECK(frame);
1483 m_loaderClient.didFirstLayoutForFrame(this, frame, userData.get());
1486 void WebPageProxy::didFirstVisuallyNonEmptyLayoutForFrame(uint64_t frameID, CoreIPC::ArgumentDecoder* arguments)
1488 RefPtr<APIObject> userData;
1489 WebContextUserMessageDecoder messageDecoder(userData, context());
1490 if (!arguments->decode(messageDecoder))
1493 WebFrameProxy* frame = process()->webFrame(frameID);
1494 MESSAGE_CHECK(frame);
1496 m_loaderClient.didFirstVisuallyNonEmptyLayoutForFrame(this, frame, userData.get());
1499 void WebPageProxy::didRemoveFrameFromHierarchy(uint64_t frameID, CoreIPC::ArgumentDecoder* arguments)
1501 RefPtr<APIObject> userData;
1502 WebContextUserMessageDecoder messageDecoder(userData, context());
1503 if (!arguments->decode(messageDecoder))
1506 WebFrameProxy* frame = process()->webFrame(frameID);
1507 MESSAGE_CHECK(frame);
1509 frame->didRemoveFromHierarchy();
1511 m_loaderClient.didRemoveFrameFromHierarchy(this, frame, userData.get());
1514 void WebPageProxy::didDisplayInsecureContentForFrame(uint64_t frameID, CoreIPC::ArgumentDecoder* arguments)
1516 RefPtr<APIObject> userData;
1517 WebContextUserMessageDecoder messageDecoder(userData, context());
1518 if (!arguments->decode(messageDecoder))
1521 WebFrameProxy* frame = process()->webFrame(frameID);
1522 MESSAGE_CHECK(frame);
1524 m_loaderClient.didDisplayInsecureContentForFrame(this, frame, userData.get());
1527 void WebPageProxy::didRunInsecureContentForFrame(uint64_t frameID, CoreIPC::ArgumentDecoder* arguments)
1529 RefPtr<APIObject> userData;
1530 WebContextUserMessageDecoder messageDecoder(userData, context());
1531 if (!arguments->decode(messageDecoder))
1534 WebFrameProxy* frame = process()->webFrame(frameID);
1535 MESSAGE_CHECK(frame);
1537 m_loaderClient.didRunInsecureContentForFrame(this, frame, userData.get());
1540 void WebPageProxy::frameDidBecomeFrameSet(uint64_t frameID, bool value)
1542 WebFrameProxy* frame = process()->webFrame(frameID);
1543 MESSAGE_CHECK(frame);
1545 frame->setIsFrameSet(value);
1546 if (frame->isMainFrame())
1547 m_frameSetLargestFrame = value ? m_mainFrame : 0;
1551 void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, uint32_t opaqueNavigationType, uint32_t opaqueModifiers, int32_t opaqueMouseButton, const ResourceRequest& request, uint64_t listenerID, CoreIPC::ArgumentDecoder* arguments, bool& receivedPolicyAction, uint64_t& policyAction)
1553 RefPtr<APIObject> userData;
1554 WebContextUserMessageDecoder messageDecoder(userData, context());
1555 if (!arguments->decode(messageDecoder))
1558 if (request.url() != pendingAPIRequestURL())
1559 clearPendingAPIRequestURL();
1561 WebFrameProxy* frame = process()->webFrame(frameID);
1562 MESSAGE_CHECK(frame);
1564 NavigationType navigationType = static_cast<NavigationType>(opaqueNavigationType);
1565 WebEvent::Modifiers modifiers = static_cast<WebEvent::Modifiers>(opaqueModifiers);
1566 WebMouseEvent::Button mouseButton = static_cast<WebMouseEvent::Button>(opaqueMouseButton);
1568 RefPtr<WebFramePolicyListenerProxy> listener = frame->setUpPolicyListenerProxy(listenerID);
1570 ASSERT(!m_inDecidePolicyForNavigationAction);
1572 m_inDecidePolicyForNavigationAction = true;
1573 m_syncNavigationActionPolicyActionIsValid = false;
1575 if (!m_policyClient.decidePolicyForNavigationAction(this, frame, navigationType, modifiers, mouseButton, request, listener.get(), userData.get()))
1578 m_inDecidePolicyForNavigationAction = false;
1580 // Check if we received a policy decision already. If we did, we can just pass it back.
1581 if (m_syncNavigationActionPolicyActionIsValid) {
1582 receivedPolicyAction = true;
1583 policyAction = m_syncNavigationActionPolicyAction;
1587 void WebPageProxy::decidePolicyForNewWindowAction(uint64_t frameID, uint32_t opaqueNavigationType, uint32_t opaqueModifiers, int32_t opaqueMouseButton, const ResourceRequest& request, const String& frameName, uint64_t listenerID, CoreIPC::ArgumentDecoder* arguments)
1589 RefPtr<APIObject> userData;
1590 WebContextUserMessageDecoder messageDecoder(userData, context());
1591 if (!arguments->decode(messageDecoder))
1594 WebFrameProxy* frame = process()->webFrame(frameID);
1595 MESSAGE_CHECK(frame);
1597 NavigationType navigationType = static_cast<NavigationType>(opaqueNavigationType);
1598 WebEvent::Modifiers modifiers = static_cast<WebEvent::Modifiers>(opaqueModifiers);
1599 WebMouseEvent::Button mouseButton = static_cast<WebMouseEvent::Button>(opaqueMouseButton);
1601 RefPtr<WebFramePolicyListenerProxy> listener = frame->setUpPolicyListenerProxy(listenerID);
1602 if (!m_policyClient.decidePolicyForNewWindowAction(this, frame, navigationType, modifiers, mouseButton, request, frameName, listener.get(), userData.get()))
1606 void WebPageProxy::decidePolicyForMIMEType(uint64_t frameID, const String& MIMEType, const ResourceRequest& request, uint64_t listenerID, CoreIPC::ArgumentDecoder* arguments, bool& receivedPolicyAction, uint64_t& policyAction, uint64_t& downloadID)
1608 RefPtr<APIObject> userData;
1609 WebContextUserMessageDecoder messageDecoder(userData, context());
1610 if (!arguments->decode(messageDecoder))
1613 WebFrameProxy* frame = process()->webFrame(frameID);
1614 MESSAGE_CHECK(frame);
1616 RefPtr<WebFramePolicyListenerProxy> listener = frame->setUpPolicyListenerProxy(listenerID);
1618 ASSERT(!m_inDecidePolicyForMIMEType);
1620 m_inDecidePolicyForMIMEType = true;
1621 m_syncMimeTypePolicyActionIsValid = false;
1623 if (!m_policyClient.decidePolicyForMIMEType(this, frame, MIMEType, request, listener.get(), 0 /*userData*/))
1626 m_inDecidePolicyForMIMEType = false;
1628 // Check if we received a policy decision already. If we did, we can just pass it back.
1629 if (m_syncMimeTypePolicyActionIsValid) {
1630 receivedPolicyAction = true;
1631 policyAction = m_syncMimeTypePolicyAction;
1632 downloadID = m_syncMimeTypePolicyDownloadID;
1638 void WebPageProxy::willSubmitForm(uint64_t frameID, uint64_t sourceFrameID, const StringPairVector& textFieldValues, uint64_t listenerID, CoreIPC::ArgumentDecoder* arguments)
1640 RefPtr<APIObject> userData;
1641 WebContextUserMessageDecoder messageDecoder(userData, context());
1642 if (!arguments->decode(messageDecoder))
1645 WebFrameProxy* frame = process()->webFrame(frameID);
1646 MESSAGE_CHECK(frame);
1648 WebFrameProxy* sourceFrame = process()->webFrame(sourceFrameID);
1649 MESSAGE_CHECK(sourceFrame);
1651 RefPtr<WebFormSubmissionListenerProxy> listener = frame->setUpFormSubmissionListenerProxy(listenerID);
1652 if (!m_formClient.willSubmitForm(this, frame, sourceFrame, textFieldValues.stringPairVector(), userData.get(), listener.get()))
1653 listener->continueSubmission();
1656 // ResourceLoad Client
1658 void WebPageProxy::didInitiateLoadForResource(uint64_t frameID, uint64_t resourceIdentifier, const ResourceRequest& request, bool pageIsProvisionallyLoading)
1660 WebFrameProxy* frame = process()->webFrame(frameID);
1661 MESSAGE_CHECK(frame);
1663 m_resourceLoadClient.didInitiateLoadForResource(this, frame, resourceIdentifier, request, pageIsProvisionallyLoading);
1666 void WebPageProxy::didSendRequestForResource(uint64_t frameID, uint64_t resourceIdentifier, const ResourceRequest& request, const ResourceResponse& redirectResponse)
1668 WebFrameProxy* frame = process()->webFrame(frameID);
1669 MESSAGE_CHECK(frame);
1671 m_resourceLoadClient.didSendRequestForResource(this, frame, resourceIdentifier, request, redirectResponse);
1674 void WebPageProxy::didReceiveResponseForResource(uint64_t frameID, uint64_t resourceIdentifier, const ResourceResponse& response)
1676 WebFrameProxy* frame = process()->webFrame(frameID);
1677 MESSAGE_CHECK(frame);
1679 m_resourceLoadClient.didReceiveResponseForResource(this, frame, resourceIdentifier, response);
1682 void WebPageProxy::didReceiveContentLengthForResource(uint64_t frameID, uint64_t resourceIdentifier, uint64_t contentLength)
1684 WebFrameProxy* frame = process()->webFrame(frameID);
1685 MESSAGE_CHECK(frame);
1687 m_resourceLoadClient.didReceiveContentLengthForResource(this, frame, resourceIdentifier, contentLength);
1690 void WebPageProxy::didFinishLoadForResource(uint64_t frameID, uint64_t resourceIdentifier)
1692 WebFrameProxy* frame = process()->webFrame(frameID);
1693 MESSAGE_CHECK(frame);
1695 m_resourceLoadClient.didFinishLoadForResource(this, frame, resourceIdentifier);
1698 void WebPageProxy::didFailLoadForResource(uint64_t frameID, uint64_t resourceIdentifier, const ResourceError& error)
1700 WebFrameProxy* frame = process()->webFrame(frameID);
1701 MESSAGE_CHECK(frame);
1703 m_resourceLoadClient.didFailLoadForResource(this, frame, resourceIdentifier, error);
1708 void WebPageProxy::createNewPage(const WindowFeatures& windowFeatures, uint32_t opaqueModifiers, int32_t opaqueMouseButton, uint64_t& newPageID, WebPageCreationParameters& newPageParameters)
1710 RefPtr<WebPageProxy> newPage = m_uiClient.createNewPage(this, windowFeatures, static_cast<WebEvent::Modifiers>(opaqueModifiers), static_cast<WebMouseEvent::Button>(opaqueMouseButton));
1712 newPageID = newPage->pageID();
1713 newPageParameters = newPage->creationParameters();
1718 void WebPageProxy::showPage()
1720 m_uiClient.showPage(this);
1723 void WebPageProxy::closePage()
1725 m_uiClient.close(this);
1728 void WebPageProxy::runJavaScriptAlert(uint64_t frameID, const String& message)
1730 WebFrameProxy* frame = process()->webFrame(frameID);
1731 MESSAGE_CHECK(frame);
1733 m_uiClient.runJavaScriptAlert(this, message, frame);
1736 void WebPageProxy::runJavaScriptConfirm(uint64_t frameID, const String& message, bool& result)
1738 WebFrameProxy* frame = process()->webFrame(frameID);
1739 MESSAGE_CHECK(frame);
1741 result = m_uiClient.runJavaScriptConfirm(this, message, frame);
1744 void WebPageProxy::runJavaScriptPrompt(uint64_t frameID, const String& message, const String& defaultValue, String& result)
1746 WebFrameProxy* frame = process()->webFrame(frameID);
1747 MESSAGE_CHECK(frame);
1749 result = m_uiClient.runJavaScriptPrompt(this, message, defaultValue, frame);
1752 void WebPageProxy::setStatusText(const String& text)
1754 m_uiClient.setStatusText(this, text);
1757 void WebPageProxy::mouseDidMoveOverElement(uint32_t opaqueModifiers, CoreIPC::ArgumentDecoder* arguments)
1759 RefPtr<APIObject> userData;
1760 WebContextUserMessageDecoder messageDecoder(userData, context());
1761 if (!arguments->decode(messageDecoder))
1764 WebEvent::Modifiers modifiers = static_cast<WebEvent::Modifiers>(opaqueModifiers);
1766 m_uiClient.mouseDidMoveOverElement(this, modifiers, userData.get());
1769 void WebPageProxy::missingPluginButtonClicked(const String& mimeType, const String& url)
1771 m_uiClient.missingPluginButtonClicked(this, mimeType, url);
1774 void WebPageProxy::setToolbarsAreVisible(bool toolbarsAreVisible)
1776 m_uiClient.setToolbarsAreVisible(this, toolbarsAreVisible);
1779 void WebPageProxy::getToolbarsAreVisible(bool& toolbarsAreVisible)
1781 toolbarsAreVisible = m_uiClient.toolbarsAreVisible(this);
1784 void WebPageProxy::setMenuBarIsVisible(bool menuBarIsVisible)
1786 m_uiClient.setMenuBarIsVisible(this, menuBarIsVisible);
1789 void WebPageProxy::getMenuBarIsVisible(bool& menuBarIsVisible)
1791 menuBarIsVisible = m_uiClient.menuBarIsVisible(this);
1794 void WebPageProxy::setStatusBarIsVisible(bool statusBarIsVisible)
1796 m_uiClient.setStatusBarIsVisible(this, statusBarIsVisible);
1799 void WebPageProxy::getStatusBarIsVisible(bool& statusBarIsVisible)
1801 statusBarIsVisible = m_uiClient.statusBarIsVisible(this);
1804 void WebPageProxy::setIsResizable(bool isResizable)
1806 m_uiClient.setIsResizable(this, isResizable);
1809 void WebPageProxy::getIsResizable(bool& isResizable)
1811 isResizable = m_uiClient.isResizable(this);
1814 void WebPageProxy::setWindowFrame(const FloatRect& newWindowFrame)
1816 m_uiClient.setWindowFrame(this, m_pageClient->convertToDeviceSpace(newWindowFrame));
1819 void WebPageProxy::getWindowFrame(FloatRect& newWindowFrame)
1821 newWindowFrame = m_pageClient->convertToUserSpace(m_uiClient.windowFrame(this));
1824 void WebPageProxy::canRunBeforeUnloadConfirmPanel(bool& canRun)
1826 canRun = m_uiClient.canRunBeforeUnloadConfirmPanel();
1829 void WebPageProxy::runBeforeUnloadConfirmPanel(const String& message, uint64_t frameID, bool& shouldClose)
1831 WebFrameProxy* frame = process()->webFrame(frameID);
1832 MESSAGE_CHECK(frame);
1834 shouldClose = m_uiClient.runBeforeUnloadConfirmPanel(this, message, frame);
1837 #if ENABLE(TILED_BACKING_STORE)
1838 void WebPageProxy::pageDidRequestScroll(const IntSize& delta)
1840 m_pageClient->pageDidRequestScroll(delta);
1844 void WebPageProxy::didChangeViewportData(const ViewportArguments& args)
1846 m_pageClient->setViewportArguments(args);
1849 void WebPageProxy::pageDidScroll()
1851 m_uiClient.pageDidScroll(this);
1854 void WebPageProxy::runOpenPanel(uint64_t frameID, const WebOpenPanelParameters::Data& data)
1856 if (m_openPanelResultListener) {
1857 m_openPanelResultListener->invalidate();
1858 m_openPanelResultListener = 0;
1861 WebFrameProxy* frame = process()->webFrame(frameID);
1862 MESSAGE_CHECK(frame);
1864 m_openPanelResultListener = WebOpenPanelResultListenerProxy::create(this);
1866 if (!m_uiClient.runOpenPanel(this, frame, data, m_openPanelResultListener.get()))
1867 didCancelForOpenPanel();
1870 void WebPageProxy::printFrame(uint64_t frameID)
1872 ASSERT(!m_isPerformingDOMPrintOperation);
1873 m_isPerformingDOMPrintOperation = true;
1875 WebFrameProxy* frame = process()->webFrame(frameID);
1876 MESSAGE_CHECK(frame);
1878 m_uiClient.printFrame(this, frame);
1880 m_isPerformingDOMPrintOperation = false;
1884 void WebPageProxy::didChangeContentsSize(const WebCore::IntSize& size)
1886 m_pageClient->didChangeContentsSize(size);
1889 void WebPageProxy::didFindZoomableArea(const WebCore::IntRect& area)
1891 m_pageClient->didFindZoomableArea(area);
1894 void WebPageProxy::findZoomableAreaForPoint(const WebCore::IntPoint& point)
1899 process()->send(Messages::WebPage::FindZoomableAreaForPoint(point), m_pageID);
1903 void WebPageProxy::didDraw()
1905 m_uiClient.didDraw(this);
1910 #if ENABLE(INSPECTOR)
1912 WebInspectorProxy* WebPageProxy::inspector()
1914 if (isClosed() || !isValid())
1917 m_inspector = WebInspectorProxy::create(this);
1918 return m_inspector.get();
1925 void WebPageProxy::backForwardAddItem(uint64_t itemID)
1927 m_backForwardList->addItem(process()->webBackForwardItem(itemID));
1930 void WebPageProxy::backForwardGoToItem(uint64_t itemID)
1932 m_backForwardList->goToItem(process()->webBackForwardItem(itemID));
1935 void WebPageProxy::backForwardItemAtIndex(int32_t index, uint64_t& itemID)
1937 WebBackForwardListItem* item = m_backForwardList->itemAtIndex(index);
1938 itemID = item ? item->itemID() : 0;
1941 void WebPageProxy::backForwardBackListCount(int32_t& count)
1943 count = m_backForwardList->backListCount();
1946 void WebPageProxy::backForwardForwardListCount(int32_t& count)
1948 count = m_backForwardList->forwardListCount();
1951 void WebPageProxy::selectionStateChanged(const SelectionState& selectionState)
1953 m_selectionState = selectionState;
1957 // Complex text input support for plug-ins.
1958 void WebPageProxy::sendComplexTextInputToPlugin(uint64_t pluginComplexTextInputIdentifier, const String& textInput)
1963 process()->send(Messages::WebPage::SendComplexTextInputToPlugin(pluginComplexTextInputIdentifier, textInput), m_pageID);
1968 void WebPageProxy::didChangeCompositionSelection(bool hasComposition)
1970 m_pageClient->compositionSelectionChanged(hasComposition);
1973 void WebPageProxy::confirmComposition(const String& compositionString)
1975 process()->send(Messages::WebPage::ConfirmComposition(compositionString), m_pageID);
1978 void WebPageProxy::setComposition(const String& compositionString, Vector<WebCore::CompositionUnderline>& underlines, int cursorPosition)
1980 process()->send(Messages::WebPage::SetComposition(compositionString, underlines, cursorPosition), m_pageID);
1986 void WebPageProxy::registerEditCommandForUndo(uint64_t commandID, uint32_t editAction)
1988 registerEditCommand(WebEditCommandProxy::create(commandID, static_cast<EditAction>(editAction), this), Undo);
1991 void WebPageProxy::clearAllEditCommands()
1993 m_pageClient->clearAllEditCommands();
1996 void WebPageProxy::didCountStringMatches(const String& string, uint32_t matchCount)
1998 m_findClient.didCountStringMatches(this, string, matchCount);
2001 void WebPageProxy::setFindIndicator(const FloatRect& selectionRectInWindowCoordinates, const Vector<FloatRect>& textRectsInSelectionRectCoordinates, const SharedMemory::Handle& contentImageHandle, bool fadeOut)
2003 RefPtr<FindIndicator> findIndicator = FindIndicator::create(selectionRectInWindowCoordinates, textRectsInSelectionRectCoordinates, contentImageHandle);
2004 m_pageClient->setFindIndicator(findIndicator.release(), fadeOut);
2007 void WebPageProxy::didFindString(const String& string, uint32_t matchCount)
2009 m_findClient.didFindString(this, string, matchCount);
2012 void WebPageProxy::didFailToFindString(const String& string)
2014 m_findClient.didFailToFindString(this, string);
2017 void WebPageProxy::valueChangedForPopupMenu(WebPopupMenuProxy*, int32_t newSelectedIndex)
2019 process()->send(Messages::WebPage::DidChangeSelectedIndexForActivePopupMenu(newSelectedIndex), m_pageID);
2022 void WebPageProxy::setTextFromItemForPopupMenu(WebPopupMenuProxy*, int32_t index)
2024 process()->send(Messages::WebPage::SetTextForActivePopupMenu(index), m_pageID);
2027 void WebPageProxy::showPopupMenu(const IntRect& rect, uint64_t textDirection, const Vector<WebPopupItem>& items, int32_t selectedIndex, const PlatformPopupMenuData& data)
2029 if (m_activePopupMenu) {
2030 m_activePopupMenu->hidePopupMenu();
2031 m_activePopupMenu->invalidate();
2032 m_activePopupMenu = 0;
2035 m_activePopupMenu = m_pageClient->createPopupMenuProxy(this);
2038 // On Windows, we're about to run our own message pump in showPopupMenu(), so turn off the responsiveness timer.
2039 process()->responsivenessTimer()->stop();
2042 RefPtr<WebPopupMenuProxy> protectedActivePopupMenu = m_activePopupMenu;
2044 protectedActivePopupMenu->showPopupMenu(rect, static_cast<TextDirection>(textDirection), items, data, selectedIndex);
2045 protectedActivePopupMenu->invalidate();
2046 protectedActivePopupMenu = 0;
2049 void WebPageProxy::hidePopupMenu()
2051 if (!m_activePopupMenu)
2054 m_activePopupMenu->hidePopupMenu();
2055 m_activePopupMenu->invalidate();
2056 m_activePopupMenu = 0;
2059 void WebPageProxy::showContextMenu(const IntPoint& menuLocation, const ContextMenuState& contextMenuState, const Vector<WebContextMenuItemData>& proposedItems, CoreIPC::ArgumentDecoder* arguments)
2061 RefPtr<APIObject> userData;
2062 WebContextUserMessageDecoder messageDecoder(userData, context());
2063 if (!arguments->decode(messageDecoder))
2066 m_activeContextMenuState = contextMenuState;
2068 if (m_activeContextMenu)
2069 m_activeContextMenu->hideContextMenu();
2071 m_activeContextMenu = m_pageClient->createContextMenuProxy(this);
2073 // Give the PageContextMenuClient one last swipe at changing the menu.
2074 Vector<WebContextMenuItemData> items;
2076 if (!m_contextMenuClient.getContextMenuFromProposedMenu(this, proposedItems, items, userData.get())) {
2077 m_activeContextMenu->showContextMenu(menuLocation, proposedItems);
2082 m_activeContextMenu->showContextMenu(menuLocation, items);
2085 void WebPageProxy::contextMenuItemSelected(const WebContextMenuItemData& item)
2087 // Application custom items don't need to round-trip through to WebCore in the WebProcess.
2088 if (item.action() >= ContextMenuItemBaseApplicationTag) {
2089 m_contextMenuClient.customContextMenuItemSelected(this, item);
2094 if (item.action() == ContextMenuItemTagSmartCopyPaste) {
2095 setSmartInsertDeleteEnabled(!isSmartInsertDeleteEnabled());
2098 if (item.action() == ContextMenuItemTagSmartQuotes) {
2099 TextChecker::setAutomaticQuoteSubstitutionEnabled(!TextChecker::state().isAutomaticQuoteSubstitutionEnabled);
2100 process()->updateTextCheckerState();
2103 if (item.action() == ContextMenuItemTagSmartDashes) {
2104 TextChecker::setAutomaticDashSubstitutionEnabled(!TextChecker::state().isAutomaticDashSubstitutionEnabled);
2105 process()->updateTextCheckerState();
2108 if (item.action() == ContextMenuItemTagSmartLinks) {
2109 TextChecker::setAutomaticLinkDetectionEnabled(!TextChecker::state().isAutomaticLinkDetectionEnabled);
2110 process()->updateTextCheckerState();
2113 if (item.action() == ContextMenuItemTagTextReplacement) {
2114 TextChecker::setAutomaticTextReplacementEnabled(!TextChecker::state().isAutomaticTextReplacementEnabled);
2115 process()->updateTextCheckerState();
2119 if (item.action() == ContextMenuItemTagDownloadImageToDisk) {
2120 m_context->download(this, KURL(KURL(), m_activeContextMenuState.absoluteImageURLString));
2123 if (item.action() == ContextMenuItemTagDownloadLinkToDisk) {
2124 m_context->download(this, KURL(KURL(), m_activeContextMenuState.absoluteLinkURLString));
2128 if (item.action() == ContextMenuItemTagLearnSpelling || item.action() == ContextMenuItemTagIgnoreSpelling)
2129 ++m_pendingLearnOrIgnoreWordMessageCount;
2131 process()->send(Messages::WebPage::DidSelectItemFromActiveContextMenu(item), m_pageID);
2134 void WebPageProxy::didChooseFilesForOpenPanel(const Vector<String>& fileURLs)
2139 #if ENABLE(WEB_PROCESS_SANDBOX)
2140 // FIXME: The sandbox extensions should be sent with the DidChooseFilesForOpenPanel message. This
2141 // is gated on a way of passing SandboxExtension::Handles in a Vector.
2142 for (size_t i = 0; i < fileURLs.size(); ++i) {
2143 SandboxExtension::Handle sandboxExtensionHandle;
2144 SandboxExtension::createHandle(fileURLs[i], SandboxExtension::ReadOnly, sandboxExtensionHandle);
2145 process()->send(Messages::WebPage::ExtendSandboxForFileFromOpenPanel(sandboxExtensionHandle), m_pageID);
2149 process()->send(Messages::WebPage::DidChooseFilesForOpenPanel(fileURLs), m_pageID);
2151 m_openPanelResultListener->invalidate();
2152 m_openPanelResultListener = 0;
2155 void WebPageProxy::didCancelForOpenPanel()
2160 process()->send(Messages::WebPage::DidCancelForOpenPanel(), m_pageID);
2162 m_openPanelResultListener->invalidate();
2163 m_openPanelResultListener = 0;
2166 void WebPageProxy::advanceToNextMisspelling(bool startBeforeSelection)
2168 process()->send(Messages::WebPage::AdvanceToNextMisspelling(startBeforeSelection), m_pageID);
2171 void WebPageProxy::changeSpellingToWord(const String& word)
2176 process()->send(Messages::WebPage::ChangeSpellingToWord(word), m_pageID);
2179 void WebPageProxy::unmarkAllMisspellings()
2181 process()->send(Messages::WebPage::UnmarkAllMisspellings(), m_pageID);
2184 void WebPageProxy::unmarkAllBadGrammar()
2186 process()->send(Messages::WebPage::UnmarkAllBadGrammar(), m_pageID);
2190 void WebPageProxy::uppercaseWord()
2192 process()->send(Messages::WebPage::UppercaseWord(), m_pageID);
2195 void WebPageProxy::lowercaseWord()
2197 process()->send(Messages::WebPage::LowercaseWord(), m_pageID);
2200 void WebPageProxy::capitalizeWord()
2202 process()->send(Messages::WebPage::CapitalizeWord(), m_pageID);
2205 void WebPageProxy::setSmartInsertDeleteEnabled(bool isSmartInsertDeleteEnabled)
2207 if (m_isSmartInsertDeleteEnabled == isSmartInsertDeleteEnabled)
2210 TextChecker::setSmartInsertDeleteEnabled(isSmartInsertDeleteEnabled);
2211 m_isSmartInsertDeleteEnabled = isSmartInsertDeleteEnabled;
2212 process()->send(Messages::WebPage::SetSmartInsertDeleteEnabled(isSmartInsertDeleteEnabled), m_pageID);
2216 void WebPageProxy::registerEditCommand(PassRefPtr<WebEditCommandProxy> commandProxy, UndoOrRedo undoOrRedo)
2218 m_pageClient->registerEditCommand(commandProxy, undoOrRedo);
2221 void WebPageProxy::addEditCommand(WebEditCommandProxy* command)
2223 m_editCommandSet.add(command);
2226 void WebPageProxy::removeEditCommand(WebEditCommandProxy* command)
2228 m_editCommandSet.remove(command);
2232 process()->send(Messages::WebPage::DidRemoveEditCommand(command->commandID()), m_pageID);
2235 int64_t WebPageProxy::spellDocumentTag()
2237 if (!m_hasSpellDocumentTag) {
2238 m_spellDocumentTag = TextChecker::uniqueSpellDocumentTag();
2239 m_hasSpellDocumentTag = true;
2242 return m_spellDocumentTag;
2245 void WebPageProxy::checkTextOfParagraph(const String& text, uint64_t checkingTypes, Vector<TextCheckingResult>& results)
2247 results = TextChecker::checkTextOfParagraph(spellDocumentTag(), text.characters(), text.length(), checkingTypes);
2250 void WebPageProxy::updateSpellingUIWithMisspelledWord(const String& misspelledWord)
2252 TextChecker::updateSpellingUIWithMisspelledWord(misspelledWord);
2255 void WebPageProxy::getGuessesForWord(const String& word, const String& context, Vector<String>& guesses)
2257 TextChecker::getGuessesForWord(spellDocumentTag(), word, context, guesses);
2260 void WebPageProxy::learnWord(const String& word)
2262 MESSAGE_CHECK(m_pendingLearnOrIgnoreWordMessageCount);
2263 --m_pendingLearnOrIgnoreWordMessageCount;
2265 TextChecker::learnWord(word);
2268 void WebPageProxy::ignoreWord(const String& word)
2270 MESSAGE_CHECK(m_pendingLearnOrIgnoreWordMessageCount);
2271 --m_pendingLearnOrIgnoreWordMessageCount;
2273 TextChecker::ignoreWord(spellDocumentTag(), word);
2278 void WebPageProxy::takeFocus(bool direction)
2280 m_pageClient->takeFocus(direction);
2283 void WebPageProxy::setToolTip(const String& toolTip)
2285 String oldToolTip = m_toolTip;
2286 m_toolTip = toolTip;
2287 m_pageClient->toolTipChanged(oldToolTip, m_toolTip);
2290 void WebPageProxy::setCursor(const WebCore::Cursor& cursor)
2292 m_pageClient->setCursor(cursor);
2295 void WebPageProxy::didValidateMenuItem(const String& commandName, bool isEnabled, int32_t state)
2297 m_pageClient->setEditCommandState(commandName, isEnabled, state);
2300 void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled)
2302 WebEvent::Type type = static_cast<WebEvent::Type>(opaqueType);
2305 case WebEvent::MouseMove:
2308 case WebEvent::MouseDown:
2309 case WebEvent::MouseUp:
2310 case WebEvent::Wheel:
2311 case WebEvent::KeyDown:
2312 case WebEvent::KeyUp:
2313 case WebEvent::RawKeyDown:
2314 case WebEvent::Char:
2315 #if ENABLE(GESTURE_EVENTS)
2316 case WebEvent::GestureScrollBegin:
2317 case WebEvent::GestureScrollEnd:
2319 process()->responsivenessTimer()->stop();
2324 case WebEvent::MouseMove:
2325 m_processingMouseMoveEvent = false;
2326 if (m_nextMouseMoveEvent) {
2327 handleMouseEvent(*m_nextMouseMoveEvent);
2328 m_nextMouseMoveEvent = nullptr;
2331 case WebEvent::MouseDown:
2332 case WebEvent::MouseUp:
2333 #if ENABLE(GESTURE_EVENTS)
2334 case WebEvent::GestureScrollBegin:
2335 case WebEvent::GestureScrollEnd:
2339 case WebEvent::Wheel: {
2340 m_processingWheelEvent = false;
2341 if (m_nextWheelEvent) {
2342 handleWheelEvent(*m_nextWheelEvent);
2343 m_nextWheelEvent = nullptr;
2348 case WebEvent::KeyDown:
2349 case WebEvent::KeyUp:
2350 case WebEvent::RawKeyDown:
2351 case WebEvent::Char: {
2352 NativeWebKeyboardEvent event = m_keyEventQueue.first();
2353 MESSAGE_CHECK(type == event.type());
2355 m_keyEventQueue.removeFirst();
2357 m_pageClient->doneWithKeyEvent(event, handled);
2362 m_uiClient.didNotHandleKeyEvent(this, event);
2368 void WebPageProxy::voidCallback(uint64_t callbackID)
2370 RefPtr<VoidCallback> callback = m_voidCallbacks.take(callbackID);
2372 // FIXME: Log error or assert.
2376 callback->performCallback();
2379 void WebPageProxy::dataCallback(const CoreIPC::DataReference& dataReference, uint64_t callbackID)
2381 RefPtr<DataCallback> callback = m_dataCallbacks.take(callbackID);
2383 // FIXME: Log error or assert.
2387 callback->performCallbackWithReturnValue(WebData::create(dataReference.data(), dataReference.size()).get());
2390 void WebPageProxy::stringCallback(const String& resultString, uint64_t callbackID)
2392 RefPtr<StringCallback> callback = m_stringCallbacks.take(callbackID);
2394 // FIXME: Log error or assert.
2398 callback->performCallbackWithReturnValue(resultString.impl());
2401 void WebPageProxy::computedPagesCallback(const Vector<WebCore::IntRect>& pageRects, double totalScaleFactorForPrinting, uint64_t callbackID)
2403 RefPtr<ComputedPagesCallback> callback = m_computedPagesCallbacks.take(callbackID);
2405 // FIXME: Log error or assert.
2409 callback->performCallbackWithReturnValue(pageRects, totalScaleFactorForPrinting);
2414 void WebPageProxy::registerWebProcessAccessibilityToken(const CoreIPC::DataReference& data)
2416 m_pageClient->accessibilityWebProcessTokenReceived(data);
2419 void WebPageProxy::registerUIProcessAccessibilityTokens(const CoreIPC::DataReference& elementToken, const CoreIPC::DataReference& windowToken)
2424 process()->send(Messages::WebPage::RegisterUIProcessAccessibilityTokens(elementToken, windowToken), m_pageID);
2428 void WebPageProxy::focusedFrameChanged(uint64_t frameID)
2435 WebFrameProxy* frame = process()->webFrame(frameID);
2436 MESSAGE_CHECK(frame);
2438 m_focusedFrame = frame;
2441 void WebPageProxy::frameSetLargestFrameChanged(uint64_t frameID)
2444 m_frameSetLargestFrame = 0;
2448 WebFrameProxy* frame = process()->webFrame(frameID);
2449 MESSAGE_CHECK(frame);
2451 m_frameSetLargestFrame = frame;
2454 #if USE(ACCELERATED_COMPOSITING)
2455 void WebPageProxy::didChangeAcceleratedCompositing(bool compositing, DrawingAreaInfo& drawingAreaInfo)
2458 didEnterAcceleratedCompositing();
2460 didLeaveAcceleratedCompositing();
2462 drawingAreaInfo = drawingArea()->info();
2466 void WebPageProxy::processDidBecomeUnresponsive()
2468 m_loaderClient.processDidBecomeUnresponsive(this);
2471 void WebPageProxy::processDidBecomeResponsive()
2473 m_loaderClient.processDidBecomeResponsive(this);
2476 void WebPageProxy::processDidCrash()
2478 ASSERT(m_pageClient);
2483 m_urlAtProcessExit = m_mainFrame->url();
2487 m_drawingArea = nullptr;
2489 #if ENABLE(INSPECTOR)
2491 m_inspector->invalidate();
2496 if (m_openPanelResultListener) {
2497 m_openPanelResultListener->invalidate();
2498 m_openPanelResultListener = 0;
2501 m_geolocationPermissionRequestManager.invalidateRequests();
2503 m_toolTip = String();
2505 m_mainFrameHasHorizontalScrollbar = false;
2506 m_mainFrameHasVerticalScrollbar = false;
2508 invalidateCallbackMap(m_voidCallbacks);
2509 invalidateCallbackMap(m_dataCallbacks);
2510 invalidateCallbackMap(m_stringCallbacks);
2511 invalidateCallbackMap(m_computedPagesCallbacks);
2513 Vector<WebEditCommandProxy*> editCommandVector;
2514 copyToVector(m_editCommandSet, editCommandVector);
2515 m_editCommandSet.clear();
2516 for (size_t i = 0, size = editCommandVector.size(); i < size; ++i)
2517 editCommandVector[i]->invalidate();
2518 m_pageClient->clearAllEditCommands();
2520 m_activePopupMenu = 0;
2522 m_estimatedProgress = 0.0;
2524 m_pendingLearnOrIgnoreWordMessageCount = 0;
2526 m_pageClient->processDidCrash();
2527 m_loaderClient.processDidCrash(this);
2530 WebPageCreationParameters WebPageProxy::creationParameters() const
2532 WebPageCreationParameters parameters;
2534 parameters.viewSize = m_pageClient->viewSize();
2535 parameters.isActive = m_pageClient->isViewWindowActive();
2536 parameters.isFocused = m_pageClient->isViewFocused();
2537 parameters.isVisible = m_pageClient->isViewVisible();
2538 parameters.isInWindow = m_pageClient->isViewInWindow();
2539 parameters.drawingAreaInfo = m_drawingArea->info();
2540 parameters.store = m_pageGroup->preferences()->store();
2541 parameters.pageGroupData = m_pageGroup->data();
2542 parameters.drawsBackground = m_drawsBackground;
2543 parameters.drawsTransparentBackground = m_drawsTransparentBackground;
2544 parameters.useFixedLayout = m_useFixedLayout;
2545 parameters.fixedLayoutSize = m_fixedLayoutSize;
2546 parameters.userAgent = userAgent();
2547 parameters.sessionState = SessionState(m_backForwardList->entries(), m_backForwardList->currentIndex());
2548 parameters.highestUsedBackForwardItemID = WebBackForwardListItem::highedUsedItemID();
2549 parameters.canRunModal = m_uiClient.canRunModal();
2552 parameters.isSmartInsertDeleteEnabled = m_isSmartInsertDeleteEnabled;
2556 parameters.nativeWindow = m_pageClient->nativeWindow();
2562 #if USE(ACCELERATED_COMPOSITING)
2563 void WebPageProxy::enterAcceleratedCompositingMode(const LayerTreeContext& layerTreeContext)
2565 m_pageClient->enterAcceleratedCompositingMode(layerTreeContext);
2568 void WebPageProxy::exitAcceleratedCompositingMode()
2570 m_pageClient->exitAcceleratedCompositingMode();
2573 void WebPageProxy::didEnterAcceleratedCompositing()
2575 m_pageClient->pageDidEnterAcceleratedCompositing();
2578 void WebPageProxy::didLeaveAcceleratedCompositing()
2580 m_pageClient->pageDidLeaveAcceleratedCompositing();
2583 #endif // USE(ACCELERATED_COMPOSITING)
2585 void WebPageProxy::backForwardClear()
2587 m_backForwardList->clear();
2590 void WebPageProxy::canAuthenticateAgainstProtectionSpaceInFrame(uint64_t frameID, const WebCore::ProtectionSpace& coreProtectionSpace, bool& canAuthenticate)
2592 WebFrameProxy* frame = process()->webFrame(frameID);
2593 MESSAGE_CHECK(frame);
2595 RefPtr<WebProtectionSpace> protectionSpace = WebProtectionSpace::create(coreProtectionSpace);
2597 canAuthenticate = m_loaderClient.canAuthenticateAgainstProtectionSpaceInFrame(this, frame, protectionSpace.get());
2600 void WebPageProxy::didReceiveAuthenticationChallenge(uint64_t frameID, const WebCore::AuthenticationChallenge& coreChallenge, uint64_t challengeID)
2602 WebFrameProxy* frame = process()->webFrame(frameID);
2603 MESSAGE_CHECK(frame);
2605 RefPtr<AuthenticationChallengeProxy> authenticationChallenge = AuthenticationChallengeProxy::create(coreChallenge, challengeID, this);
2607 m_loaderClient.didReceiveAuthenticationChallengeInFrame(this, frame, authenticationChallenge.get());
2610 void WebPageProxy::exceededDatabaseQuota(uint64_t frameID, const String& originIdentifier, const String& databaseName, const String& displayName, uint64_t currentQuota, uint64_t currentUsage, uint64_t expectedUsage, uint64_t& newQuota)
2612 WebFrameProxy* frame = process()->webFrame(frameID);
2613 MESSAGE_CHECK(frame);
2615 RefPtr<WebSecurityOrigin> origin = WebSecurityOrigin::create(originIdentifier);
2617 newQuota = m_uiClient.exceededDatabaseQuota(this, frame, origin.get(), databaseName, displayName, currentQuota, currentUsage, expectedUsage);
2620 void WebPageProxy::requestGeolocationPermissionForFrame(uint64_t geolocationID, uint64_t frameID, String originIdentifier)
2622 WebFrameProxy* frame = process()->webFrame(frameID);
2623 MESSAGE_CHECK(frame);
2625 RefPtr<WebSecurityOrigin> origin = WebSecurityOrigin::create(originIdentifier);
2626 RefPtr<GeolocationPermissionRequestProxy> request = m_geolocationPermissionRequestManager.createRequest(geolocationID);
2628 if (!m_uiClient.decidePolicyForGeolocationPermissionRequest(this, frame, origin.get(), request.get()))
2632 float WebPageProxy::headerHeight(WebFrameProxy* frame)
2634 return m_uiClient.headerHeight(this, frame);
2637 float WebPageProxy::footerHeight(WebFrameProxy* frame)
2639 return m_uiClient.footerHeight(this, frame);
2642 void WebPageProxy::drawHeader(WebFrameProxy* frame, const FloatRect& rect)
2644 m_uiClient.drawHeader(this, frame, rect);
2647 void WebPageProxy::drawFooter(WebFrameProxy* frame, const FloatRect& rect)
2649 m_uiClient.drawFooter(this, frame, rect);
2652 void WebPageProxy::didCompleteRubberBandForMainFrame(const IntSize& initialOverhang)
2654 m_uiClient.didCompleteRubberBandForMainFrame(this, initialOverhang);
2657 void WebPageProxy::didChangeScrollbarsForMainFrame(bool hasHorizontalScrollbar, bool hasVerticalScrollbar)
2659 m_mainFrameHasHorizontalScrollbar = hasHorizontalScrollbar;
2660 m_mainFrameHasVerticalScrollbar = hasVerticalScrollbar;
2662 m_pageClient->didChangeScrollbarsForMainFrame();
2665 void WebPageProxy::didFinishLoadingDataForCustomRepresentation(const CoreIPC::DataReference& dataReference)
2667 m_pageClient->didFinishLoadingDataForCustomRepresentation(dataReference);
2671 void WebPageProxy::setComplexTextInputEnabled(uint64_t pluginComplexTextInputIdentifier, bool complexTextInputEnabled)
2673 m_pageClient->setComplexTextInputEnabled(pluginComplexTextInputIdentifier, complexTextInputEnabled);
2676 void WebPageProxy::setAutodisplay(bool newState)
2678 m_pageClient->setAutodisplay(newState);
2682 void WebPageProxy::backForwardRemovedItem(uint64_t itemID)
2684 process()->send(Messages::WebPage::DidRemoveBackForwardItem(itemID), m_pageID);
2687 void WebPageProxy::beginPrinting(WebFrameProxy* frame, const PrintInfo& printInfo)
2689 if (m_isInPrintingMode)
2692 m_isInPrintingMode = true;
2693 process()->send(Messages::WebPage::BeginPrinting(frame->frameID(), printInfo), m_pageID, m_isPerformingDOMPrintOperation ? CoreIPC::DispatchMessageEvenWhenWaitingForSyncReply : 0);
2696 void WebPageProxy::endPrinting()
2698 if (!m_isInPrintingMode)
2701 m_isInPrintingMode = false;
2702 process()->send(Messages::WebPage::EndPrinting(), m_pageID, m_isPerformingDOMPrintOperation ? CoreIPC::DispatchMessageEvenWhenWaitingForSyncReply : 0);
2705 void WebPageProxy::computePagesForPrinting(WebFrameProxy* frame, const PrintInfo& printInfo, PassRefPtr<ComputedPagesCallback> callback)
2707 uint64_t callbackID = callback->callbackID();
2708 m_computedPagesCallbacks.set(callbackID, callback.get());
2709 m_isInPrintingMode = true;
2710 process()->send(Messages::WebPage::ComputePagesForPrinting(frame->frameID(), printInfo, callbackID), m_pageID, m_isPerformingDOMPrintOperation ? CoreIPC::DispatchMessageEvenWhenWaitingForSyncReply : 0);
2714 void WebPageProxy::drawRectToPDF(WebFrameProxy* frame, const IntRect& rect, PassRefPtr<DataCallback> callback)
2716 uint64_t callbackID = callback->callbackID();
2717 m_dataCallbacks.set(callbackID, callback.get());
2718 process()->send(Messages::WebPage::DrawRectToPDF(frame->frameID(), rect, callbackID), m_pageID, m_isPerformingDOMPrintOperation ? CoreIPC::DispatchMessageEvenWhenWaitingForSyncReply : 0);
2721 void WebPageProxy::drawPagesToPDF(WebFrameProxy* frame, uint32_t first, uint32_t count, PassRefPtr<DataCallback> callback)
2723 uint64_t callbackID = callback->callbackID();
2724 m_dataCallbacks.set(callbackID, callback.get());
2725 process()->send(Messages::WebPage::DrawPagesToPDF(frame->frameID(), first, count, callbackID), m_pageID, m_isPerformingDOMPrintOperation ? CoreIPC::DispatchMessageEvenWhenWaitingForSyncReply : 0);
2729 } // namespace WebKit