Home | History | Annotate | Download | only in UIProcess
      1 /*
      2  * Copyright (C) 2010, 2011 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      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.
     12  *
     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.
     24  */
     25 
     26 #ifndef WebPageProxy_h
     27 #define WebPageProxy_h
     28 
     29 #include "APIObject.h"
     30 #include "Connection.h"
     31 #include "ContextMenuState.h"
     32 #include "DragControllerAction.h"
     33 #include "DrawingAreaProxy.h"
     34 #include "EditorState.h"
     35 #include "GeolocationPermissionRequestManagerProxy.h"
     36 #include "SandboxExtension.h"
     37 #include "SharedMemory.h"
     38 #include "WKBase.h"
     39 #include "WKPagePrivate.h"
     40 #include "WebContextMenuItemData.h"
     41 #include "WebFindClient.h"
     42 #include "WebFormClient.h"
     43 #include "WebFrameProxy.h"
     44 #include "WebHistoryClient.h"
     45 #include "WebLoaderClient.h"
     46 #include "WebPageContextMenuClient.h"
     47 #include "WebPolicyClient.h"
     48 #include "WebPopupMenuProxy.h"
     49 #include "WebResourceLoadClient.h"
     50 #include "WebUIClient.h"
     51 #include <WebCore/ScrollTypes.h>
     52 #include <wtf/HashMap.h>
     53 #include <wtf/HashSet.h>
     54 #include <wtf/OwnPtr.h>
     55 #include <wtf/PassOwnPtr.h>
     56 #include <wtf/PassRefPtr.h>
     57 #include <wtf/RefPtr.h>
     58 #include <wtf/text/WTFString.h>
     59 
     60 namespace CoreIPC {
     61     class ArgumentDecoder;
     62     class Connection;
     63     class MessageID;
     64 }
     65 
     66 namespace WebCore {
     67     class AuthenticationChallenge;
     68     class Cursor;
     69     class DragData;
     70     class FloatRect;
     71     class IntSize;
     72     class ProtectionSpace;
     73     struct TextCheckingResult;
     74     struct ViewportArguments;
     75     struct WindowFeatures;
     76 }
     77 
     78 namespace WebKit {
     79 
     80 class NativeWebKeyboardEvent;
     81 class NativeWebMouseEvent;
     82 class PageClient;
     83 class PlatformCertificateInfo;
     84 class StringPairVector;
     85 class WebBackForwardList;
     86 class WebBackForwardListItem;
     87 class WebContextMenuProxy;
     88 class WebData;
     89 class WebEditCommandProxy;
     90 class WebFullScreenManagerProxy;
     91 class WebKeyboardEvent;
     92 class WebMouseEvent;
     93 class WebOpenPanelResultListenerProxy;
     94 class WebPageGroup;
     95 class WebProcessProxy;
     96 class WebURLRequest;
     97 class WebWheelEvent;
     98 struct AttributedString;
     99 struct DictionaryPopupInfo;
    100 struct EditorState;
    101 struct PlatformPopupMenuData;
    102 struct PrintInfo;
    103 struct WebPageCreationParameters;
    104 struct WebPopupItem;
    105 
    106 #if ENABLE(GESTURE_EVENTS)
    107 class WebGestureEvent;
    108 #endif
    109 
    110 typedef GenericCallback<WKStringRef, StringImpl*> StringCallback;
    111 typedef GenericCallback<WKSerializedScriptValueRef, WebSerializedScriptValue*> ScriptValueCallback;
    112 
    113 // FIXME: Make a version of CallbackBase with three arguments, and define ValidateCommandCallback as a specialization.
    114 class ValidateCommandCallback : public CallbackBase {
    115 public:
    116     typedef void (*CallbackFunction)(WKStringRef, bool, int32_t, WKErrorRef, void*);
    117 
    118     static PassRefPtr<ValidateCommandCallback> create(void* context, CallbackFunction callback)
    119     {
    120         return adoptRef(new ValidateCommandCallback(context, callback));
    121     }
    122 
    123     virtual ~ValidateCommandCallback()
    124     {
    125         ASSERT(!m_callback);
    126     }
    127 
    128     void performCallbackWithReturnValue(StringImpl* returnValue1, bool returnValue2, int returnValue3)
    129     {
    130         ASSERT(m_callback);
    131 
    132         m_callback(toAPI(returnValue1), returnValue2, returnValue3, 0, context());
    133 
    134         m_callback = 0;
    135     }
    136 
    137     void invalidate()
    138     {
    139         ASSERT(m_callback);
    140 
    141         RefPtr<WebError> error = WebError::create();
    142         m_callback(0, 0, 0, toAPI(error.get()), context());
    143 
    144         m_callback = 0;
    145     }
    146 
    147 private:
    148 
    149     ValidateCommandCallback(void* context, CallbackFunction callback)
    150         : CallbackBase(context)
    151         , m_callback(callback)
    152     {
    153     }
    154 
    155     CallbackFunction m_callback;
    156 };
    157 
    158 class WebPageProxy : public APIObject, public WebPopupMenuProxy::Client {
    159 public:
    160     static const Type APIType = TypePage;
    161 
    162     static PassRefPtr<WebPageProxy> create(PageClient*, PassRefPtr<WebProcessProxy>, WebPageGroup*, uint64_t pageID);
    163     virtual ~WebPageProxy();
    164 
    165     uint64_t pageID() const { return m_pageID; }
    166 
    167     WebFrameProxy* mainFrame() const { return m_mainFrame.get(); }
    168     WebFrameProxy* focusedFrame() const { return m_focusedFrame.get(); }
    169     WebFrameProxy* frameSetLargestFrame() const { return m_frameSetLargestFrame.get(); }
    170 
    171     DrawingAreaProxy* drawingArea() { return m_drawingArea.get(); }
    172     void setDrawingArea(PassOwnPtr<DrawingAreaProxy>);
    173 
    174     WebBackForwardList* backForwardList() { return m_backForwardList.get(); }
    175 
    176 #if ENABLE(INSPECTOR)
    177     WebInspectorProxy* inspector();
    178 #endif
    179 
    180 #if ENABLE(FULLSCREEN_API)
    181     WebFullScreenManagerProxy* fullScreenManager();
    182 #endif
    183 
    184     void initializeContextMenuClient(const WKPageContextMenuClient*);
    185     void initializeFindClient(const WKPageFindClient*);
    186     void initializeFormClient(const WKPageFormClient*);
    187     void initializeLoaderClient(const WKPageLoaderClient*);
    188     void initializePolicyClient(const WKPagePolicyClient*);
    189     void initializeResourceLoadClient(const WKPageResourceLoadClient*);
    190     void initializeUIClient(const WKPageUIClient*);
    191 
    192     void initializeWebPage();
    193 
    194     void close();
    195     bool tryClose();
    196     bool isClosed() const { return m_isClosed; }
    197 
    198     void loadURL(const String&);
    199     void loadURLRequest(WebURLRequest*);
    200     void loadHTMLString(const String& htmlString, const String& baseURL);
    201     void loadAlternateHTMLString(const String& htmlString, const String& baseURL, const String& unreachableURL);
    202     void loadPlainTextString(const String& string);
    203 
    204     void stopLoading();
    205     void reload(bool reloadFromOrigin);
    206 
    207     void goForward();
    208     bool canGoForward() const;
    209     void goBack();
    210     bool canGoBack() const;
    211 
    212     void goToBackForwardItem(WebBackForwardListItem*);
    213     void didChangeBackForwardList(WebBackForwardListItem* addedItem, Vector<RefPtr<APIObject> >* removedItems);
    214     void shouldGoToBackForwardListItem(uint64_t itemID, bool& shouldGoToBackForwardListItem);
    215 
    216     bool canShowMIMEType(const String& mimeType) const;
    217 
    218     bool drawsBackground() const { return m_drawsBackground; }
    219     void setDrawsBackground(bool);
    220 
    221     bool drawsTransparentBackground() const { return m_drawsTransparentBackground; }
    222     void setDrawsTransparentBackground(bool);
    223 
    224     void viewWillStartLiveResize();
    225     void viewWillEndLiveResize();
    226 
    227     void setInitialFocus(bool);
    228     void setWindowResizerSize(const WebCore::IntSize&);
    229 
    230     void setViewNeedsDisplay(const WebCore::IntRect&);
    231     void displayView();
    232     void scrollView(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset);
    233 
    234     enum {
    235         ViewWindowIsActive = 1 << 0,
    236         ViewIsFocused = 1 << 1,
    237         ViewIsVisible = 1 << 2,
    238         ViewIsInWindow = 1 << 3
    239     };
    240     typedef unsigned ViewStateFlags;
    241     void viewStateDidChange(ViewStateFlags flags);
    242 
    243     WebCore::IntSize viewSize() const;
    244     bool isViewVisible() const { return m_isVisible; }
    245     bool isViewWindowActive() const;
    246 
    247     void executeEditCommand(const String& commandName);
    248     void validateCommand(const String& commandName, PassRefPtr<ValidateCommandCallback>);
    249 
    250     const EditorState& editorState() const { return m_editorState; }
    251     bool canDelete() const { return hasSelectedRange() && isContentEditable(); }
    252     bool hasSelectedRange() const { return m_editorState.selectionIsRange; }
    253     bool isContentEditable() const { return m_editorState.isContentEditable; }
    254 
    255 #if PLATFORM(MAC)
    256     void updateWindowIsVisible(bool windowIsVisible);
    257     void windowAndViewFramesChanged(const WebCore::IntRect& windowFrameInScreenCoordinates, const WebCore::IntRect& viewFrameInWindowCoordinates, const WebCore::IntPoint& accessibilityViewCoordinates);
    258 
    259     void setComposition(const String& text, Vector<WebCore::CompositionUnderline> underlines, uint64_t selectionStart, uint64_t selectionEnd, uint64_t replacementRangeStart, uint64_t replacementRangeEnd);
    260     void confirmComposition();
    261     bool insertText(const String& text, uint64_t replacementRangeStart, uint64_t replacementRangeEnd);
    262     void getMarkedRange(uint64_t& location, uint64_t& length);
    263     void getSelectedRange(uint64_t& location, uint64_t& length);
    264     void getAttributedSubstringFromRange(uint64_t location, uint64_t length, AttributedString&);
    265     uint64_t characterIndexForPoint(const WebCore::IntPoint);
    266     WebCore::IntRect firstRectForCharacterRange(uint64_t, uint64_t);
    267     bool executeKeypressCommands(const Vector<WebCore::KeypressCommand>&);
    268 
    269     void sendComplexTextInputToPlugin(uint64_t pluginComplexTextInputIdentifier, const String& textInput);
    270     CGContextRef containingWindowGraphicsContext();
    271     bool shouldDelayWindowOrderingForEvent(const WebMouseEvent&);
    272     bool acceptsFirstMouse(int eventNumber, const WebMouseEvent&);
    273 #endif
    274 #if PLATFORM(WIN)
    275     void didChangeCompositionSelection(bool);
    276     void confirmComposition(const String&);
    277     void setComposition(const String&, Vector<WebCore::CompositionUnderline>&, int);
    278     WebCore::IntRect firstRectForCharacterInSelectedRange(int);
    279     String getSelectedText();
    280 
    281     bool gestureWillBegin(const WebCore::IntPoint&);
    282     void gestureDidScroll(const WebCore::IntSize&);
    283     void gestureDidEnd();
    284 
    285     void setGestureReachedScrollingLimit(bool);
    286 #endif
    287 #if ENABLE(TILED_BACKING_STORE)
    288     void setActualVisibleContentRect(const WebCore::IntRect& rect);
    289 #endif
    290 
    291     void handleMouseEvent(const NativeWebMouseEvent&);
    292     void handleWheelEvent(const WebWheelEvent&);
    293     void handleKeyboardEvent(const NativeWebKeyboardEvent&);
    294 #if ENABLE(GESTURE_EVENTS)
    295     void handleGestureEvent(const WebGestureEvent&);
    296 #endif
    297 #if ENABLE(TOUCH_EVENTS)
    298     void handleTouchEvent(const WebTouchEvent&);
    299 #endif
    300 
    301     void scrollBy(WebCore::ScrollDirection, WebCore::ScrollGranularity);
    302 
    303     String pageTitle() const;
    304     const String& toolTip() const { return m_toolTip; }
    305 
    306     void setUserAgent(const String&);
    307     const String& userAgent() const { return m_userAgent; }
    308     void setApplicationNameForUserAgent(const String&);
    309     const String& applicationNameForUserAgent() const { return m_applicationNameForUserAgent; }
    310     void setCustomUserAgent(const String&);
    311     const String& customUserAgent() const { return m_customUserAgent; }
    312 
    313     bool supportsTextEncoding() const;
    314     void setCustomTextEncodingName(const String&);
    315     String customTextEncodingName() const { return m_customTextEncodingName; }
    316 
    317     double estimatedProgress() const;
    318 
    319     void terminateProcess();
    320 
    321     typedef bool (*WebPageProxySessionStateFilterCallback)(WKPageRef, WKStringRef type, WKTypeRef object, void* context);
    322     PassRefPtr<WebData> sessionStateData(WebPageProxySessionStateFilterCallback, void* context) const;
    323     void restoreFromSessionStateData(WebData*);
    324 
    325     bool supportsTextZoom() const;
    326     double textZoomFactor() const { return m_mainFrameHasCustomRepresentation ? 1 : m_textZoomFactor; }
    327     void setTextZoomFactor(double);
    328     double pageZoomFactor() const;
    329     void setPageZoomFactor(double);
    330     void setPageAndTextZoomFactors(double pageZoomFactor, double textZoomFactor);
    331 
    332     void scaleWebView(double scale, const WebCore::IntPoint& origin);
    333     double viewScaleFactor() const { return m_viewScaleFactor; }
    334 
    335     void setUseFixedLayout(bool);
    336     void setFixedLayoutSize(const WebCore::IntSize&);
    337     bool useFixedLayout() const { return m_useFixedLayout; };
    338     const WebCore::IntSize& fixedLayoutSize() const { return m_fixedLayoutSize; };
    339 
    340     bool hasHorizontalScrollbar() const { return m_mainFrameHasHorizontalScrollbar; }
    341     bool hasVerticalScrollbar() const { return m_mainFrameHasVerticalScrollbar; }
    342 
    343     bool isPinnedToLeftSide() const { return m_mainFrameIsPinnedToLeftSide; }
    344     bool isPinnedToRightSide() const { return m_mainFrameIsPinnedToRightSide; }
    345 
    346 #if PLATFORM(MAC)
    347     // Called by the web process through a message.
    348     void registerWebProcessAccessibilityToken(const CoreIPC::DataReference&);
    349     // Called by the UI process when it is ready to send its tokens to the web process.
    350     void registerUIProcessAccessibilityTokens(const CoreIPC::DataReference& elemenToken, const CoreIPC::DataReference& windowToken);
    351     bool writeSelectionToPasteboard(const String& pasteboardName, const Vector<String>& pasteboardTypes);
    352     bool readSelectionFromPasteboard(const String& pasteboardName);
    353 #endif
    354 
    355     void viewScaleFactorDidChange(double);
    356 
    357     void setMemoryCacheClientCallsEnabled(bool);
    358 
    359     // Find.
    360     void findString(const String&, FindOptions, unsigned maxMatchCount);
    361     void hideFindUI();
    362     void countStringMatches(const String&, FindOptions, unsigned maxMatchCount);
    363     void didCountStringMatches(const String&, uint32_t matchCount);
    364     void setFindIndicator(const WebCore::FloatRect& selectionRectInWindowCoordinates, const Vector<WebCore::FloatRect>& textRectsInSelectionRectCoordinates, const ShareableBitmap::Handle& contentImageHandle, bool fadeOut);
    365     void didFindString(const String&, uint32_t matchCount);
    366     void didFailToFindString(const String&);
    367 
    368     void getContentsAsString(PassRefPtr<StringCallback>);
    369     void getMainResourceDataOfFrame(WebFrameProxy*, PassRefPtr<DataCallback>);
    370     void getResourceDataFromFrame(WebFrameProxy*, WebURL*, PassRefPtr<DataCallback>);
    371     void getRenderTreeExternalRepresentation(PassRefPtr<StringCallback>);
    372     void getSelectionOrContentsAsString(PassRefPtr<StringCallback>);
    373     void getSourceForFrame(WebFrameProxy*, PassRefPtr<StringCallback>);
    374     void getWebArchiveOfFrame(WebFrameProxy*, PassRefPtr<DataCallback>);
    375     void runJavaScriptInMainFrame(const String&, PassRefPtr<ScriptValueCallback>);
    376     void forceRepaint(PassRefPtr<VoidCallback>);
    377 
    378     float headerHeight(WebFrameProxy*);
    379     float footerHeight(WebFrameProxy*);
    380     void drawHeader(WebFrameProxy*, const WebCore::FloatRect&);
    381     void drawFooter(WebFrameProxy*, const WebCore::FloatRect&);
    382 
    383 #if PLATFORM(MAC)
    384     // Dictionary.
    385     void performDictionaryLookupAtLocation(const WebCore::FloatPoint&);
    386 #endif
    387 
    388     void receivedPolicyDecision(WebCore::PolicyAction, WebFrameProxy*, uint64_t listenerID);
    389 
    390     void backForwardRemovedItem(uint64_t itemID);
    391 
    392     // Drag and drop support.
    393     void dragEntered(WebCore::DragData*, const String& dragStorageName = String());
    394     void dragUpdated(WebCore::DragData*, const String& dragStorageName = String());
    395     void dragExited(WebCore::DragData*, const String& dragStorageName = String());
    396     void performDrag(WebCore::DragData*, const String& dragStorageName, const SandboxExtension::Handle&);
    397 
    398     void didPerformDragControllerAction(uint64_t resultOperation);
    399     void dragEnded(const WebCore::IntPoint& clientPosition, const WebCore::IntPoint& globalPosition, uint64_t operation);
    400 #if PLATFORM(MAC)
    401     void setDragImage(const WebCore::IntPoint& clientPosition, const ShareableBitmap::Handle& dragImageHandle, bool isLinkDrag);
    402 #endif
    403 #if PLATFORM(WIN)
    404     void startDragDrop(const WebCore::IntPoint& imagePoint, const WebCore::IntPoint& dragPoint, uint64_t okEffect, const HashMap<UINT, Vector<String> >& dataMap, const WebCore::IntSize& dragImageSize, const SharedMemory::Handle& dragImageHandle, bool isLinkDrag);
    405 #endif
    406     void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
    407     void didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, CoreIPC::ArgumentEncoder*);
    408 
    409     void processDidBecomeUnresponsive();
    410     void processDidBecomeResponsive();
    411     void processDidCrash();
    412 
    413 #if USE(ACCELERATED_COMPOSITING)
    414     virtual void enterAcceleratedCompositingMode(const LayerTreeContext&);
    415     virtual void exitAcceleratedCompositingMode();
    416 #endif
    417 
    418     void didDraw();
    419 
    420     enum UndoOrRedo { Undo, Redo };
    421     void addEditCommand(WebEditCommandProxy*);
    422     void removeEditCommand(WebEditCommandProxy*);
    423     bool isValidEditCommand(WebEditCommandProxy*);
    424     void registerEditCommand(PassRefPtr<WebEditCommandProxy>, UndoOrRedo);
    425 
    426     WebProcessProxy* process() const;
    427 
    428     WebPageGroup* pageGroup() const { return m_pageGroup.get(); }
    429 
    430     bool isValid();
    431 
    432     WebCore::DragOperation dragOperation() { return m_currentDragOperation; }
    433     void resetDragOperation() { m_currentDragOperation = WebCore::DragOperationNone; }
    434 
    435     void preferencesDidChange();
    436 
    437 #if ENABLE(TILED_BACKING_STORE)
    438     void setResizesToContentsUsingLayoutSize(const WebCore::IntSize&);
    439 #endif
    440 
    441     // Called by the WebContextMenuProxy.
    442     void contextMenuItemSelected(const WebContextMenuItemData&);
    443 
    444     // Called by the WebOpenPanelResultListenerProxy.
    445     void didChooseFilesForOpenPanel(const Vector<String>&);
    446     void didCancelForOpenPanel();
    447 
    448     WebPageCreationParameters creationParameters() const;
    449 
    450 #if PLATFORM(QT)
    451     void findZoomableAreaForPoint(const WebCore::IntPoint&);
    452 #endif
    453 
    454     void advanceToNextMisspelling(bool startBeforeSelection) const;
    455     void changeSpellingToWord(const String& word) const;
    456 #if PLATFORM(MAC)
    457     void uppercaseWord();
    458     void lowercaseWord();
    459     void capitalizeWord();
    460 
    461     bool isSmartInsertDeleteEnabled() const { return m_isSmartInsertDeleteEnabled; }
    462     void setSmartInsertDeleteEnabled(bool);
    463 #endif
    464 
    465     void beginPrinting(WebFrameProxy*, const PrintInfo&);
    466     void endPrinting();
    467     void computePagesForPrinting(WebFrameProxy*, const PrintInfo&, PassRefPtr<ComputedPagesCallback>);
    468 #if PLATFORM(MAC) || PLATFORM(WIN)
    469     void drawRectToPDF(WebFrameProxy*, const WebCore::IntRect&, PassRefPtr<DataCallback>);
    470     void drawPagesToPDF(WebFrameProxy*, uint32_t first, uint32_t count, PassRefPtr<DataCallback>);
    471 #endif
    472 
    473     const String& pendingAPIRequestURL() const { return m_pendingAPIRequestURL; }
    474 
    475     void flashBackingStoreUpdates(const Vector<WebCore::IntRect>& updateRects);
    476 
    477 #if PLATFORM(MAC)
    478     void handleCorrectionPanelResult(const String& result);
    479 #endif
    480 
    481     static void setDebugPaintFlags(WKPageDebugPaintFlags flags) { s_debugPaintFlags = flags; }
    482     static WKPageDebugPaintFlags debugPaintFlags() { return s_debugPaintFlags; }
    483 
    484     // Color to be used with kWKDebugFlashViewUpdates.
    485     static WebCore::Color viewUpdatesFlashColor();
    486 
    487     // Color to be used with kWKDebugFlashBackingStoreUpdates.
    488     static WebCore::Color backingStoreUpdatesFlashColor();
    489 
    490     void saveDataToFileInDownloadsFolder(const String& suggestedFilename, const String& mimeType, const String& originatingURLString, WebData*);
    491 
    492     void linkClicked(const String&, const WebMouseEvent&);
    493 
    494 private:
    495     WebPageProxy(PageClient*, PassRefPtr<WebProcessProxy>, WebPageGroup*, uint64_t pageID);
    496 
    497     virtual Type type() const { return APIType; }
    498 
    499     // WebPopupMenuProxy::Client
    500     virtual void valueChangedForPopupMenu(WebPopupMenuProxy*, int32_t newSelectedIndex);
    501     virtual void setTextFromItemForPopupMenu(WebPopupMenuProxy*, int32_t index);
    502     virtual NativeWebMouseEvent* currentlyProcessedMouseDownEvent();
    503 
    504     // Implemented in generated WebPageProxyMessageReceiver.cpp
    505     void didReceiveWebPageProxyMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
    506     CoreIPC::SyncReplyMode didReceiveSyncWebPageProxyMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, CoreIPC::ArgumentEncoder*);
    507 
    508     void didCreateMainFrame(uint64_t frameID);
    509     void didCreateSubframe(uint64_t frameID, uint64_t parentFrameID);
    510     void didSaveFrameToPageCache(uint64_t frameID);
    511     void didRestoreFrameFromPageCache(uint64_t frameID, uint64_t parentFrameID);
    512 
    513     void didStartProvisionalLoadForFrame(uint64_t frameID, const String& url, const String& unreachableURL, CoreIPC::ArgumentDecoder*);
    514     void didReceiveServerRedirectForProvisionalLoadForFrame(uint64_t frameID, const String&, CoreIPC::ArgumentDecoder*);
    515     void didFailProvisionalLoadForFrame(uint64_t frameID, const WebCore::ResourceError&, CoreIPC::ArgumentDecoder*);
    516     void didCommitLoadForFrame(uint64_t frameID, const String& mimeType, bool frameHasCustomRepresentation, const PlatformCertificateInfo&, CoreIPC::ArgumentDecoder*);
    517     void didFinishDocumentLoadForFrame(uint64_t frameID, CoreIPC::ArgumentDecoder*);
    518     void didFinishLoadForFrame(uint64_t frameID, CoreIPC::ArgumentDecoder*);
    519     void didFailLoadForFrame(uint64_t frameID, const WebCore::ResourceError&, CoreIPC::ArgumentDecoder*);
    520     void didSameDocumentNavigationForFrame(uint64_t frameID, uint32_t sameDocumentNavigationType, const String&, CoreIPC::ArgumentDecoder*);
    521     void didReceiveTitleForFrame(uint64_t frameID, const String&, CoreIPC::ArgumentDecoder*);
    522     void didFirstLayoutForFrame(uint64_t frameID, CoreIPC::ArgumentDecoder*);
    523     void didFirstVisuallyNonEmptyLayoutForFrame(uint64_t frameID, CoreIPC::ArgumentDecoder*);
    524     void didRemoveFrameFromHierarchy(uint64_t frameID, CoreIPC::ArgumentDecoder*);
    525     void didDisplayInsecureContentForFrame(uint64_t frameID, CoreIPC::ArgumentDecoder*);
    526     void didRunInsecureContentForFrame(uint64_t frameID, CoreIPC::ArgumentDecoder*);
    527     void frameDidBecomeFrameSet(uint64_t frameID, bool);
    528     void didStartProgress();
    529     void didChangeProgress(double);
    530     void didFinishProgress();
    531 
    532     void decidePolicyForNavigationAction(uint64_t frameID, uint32_t navigationType, uint32_t modifiers, int32_t mouseButton, const WebCore::ResourceRequest&, uint64_t listenerID, CoreIPC::ArgumentDecoder*, bool& receivedPolicyAction, uint64_t& policyAction, uint64_t& downloadID);
    533     void decidePolicyForNewWindowAction(uint64_t frameID, uint32_t navigationType, uint32_t modifiers, int32_t mouseButton, const WebCore::ResourceRequest&, const String& frameName, uint64_t listenerID, CoreIPC::ArgumentDecoder*);
    534     void decidePolicyForResponse(uint64_t frameID, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, uint64_t listenerID, CoreIPC::ArgumentDecoder* arguments, bool& receivedPolicyAction, uint64_t& policyAction, uint64_t& downloadID);
    535     void unableToImplementPolicy(uint64_t frameID, const WebCore::ResourceError&, CoreIPC::ArgumentDecoder* arguments);
    536 
    537     void willSubmitForm(uint64_t frameID, uint64_t sourceFrameID, const StringPairVector& textFieldValues, uint64_t listenerID, CoreIPC::ArgumentDecoder*);
    538 
    539     // Resource load client
    540     void didInitiateLoadForResource(uint64_t frameID, uint64_t resourceIdentifier, const WebCore::ResourceRequest&, bool pageIsProvisionallyLoading);
    541     void didSendRequestForResource(uint64_t frameID, uint64_t resourceIdentifier, const WebCore::ResourceRequest&, const WebCore::ResourceResponse& redirectResponse);
    542     void didReceiveResponseForResource(uint64_t frameID, uint64_t resourceIdentifier, const WebCore::ResourceResponse&);
    543     void didReceiveContentLengthForResource(uint64_t frameID, uint64_t resourceIdentifier, uint64_t contentLength);
    544     void didFinishLoadForResource(uint64_t frameID, uint64_t resourceIdentifier);
    545     void didFailLoadForResource(uint64_t frameID, uint64_t resourceIdentifier, const WebCore::ResourceError&);
    546 
    547     // UI client
    548     void createNewPage(const WebCore::WindowFeatures&, uint32_t modifiers, int32_t mouseButton, uint64_t& newPageID, WebPageCreationParameters&);
    549     void showPage();
    550     void closePage();
    551     void runJavaScriptAlert(uint64_t frameID, const String&);
    552     void runJavaScriptConfirm(uint64_t frameID, const String&, bool& result);
    553     void runJavaScriptPrompt(uint64_t frameID, const String&, const String&, String& result);
    554     void setStatusText(const String&);
    555     void mouseDidMoveOverElement(uint32_t modifiers, CoreIPC::ArgumentDecoder*);
    556     void missingPluginButtonClicked(const String& mimeType, const String& url, const String& pluginsPageURL);
    557     void setToolbarsAreVisible(bool toolbarsAreVisible);
    558     void getToolbarsAreVisible(bool& toolbarsAreVisible);
    559     void setMenuBarIsVisible(bool menuBarIsVisible);
    560     void getMenuBarIsVisible(bool& menuBarIsVisible);
    561     void setStatusBarIsVisible(bool statusBarIsVisible);
    562     void getStatusBarIsVisible(bool& statusBarIsVisible);
    563     void setIsResizable(bool isResizable);
    564     void getIsResizable(bool& isResizable);
    565     void setWindowFrame(const WebCore::FloatRect&);
    566     void getWindowFrame(WebCore::FloatRect&);
    567     void windowToScreen(const WebCore::IntRect& viewRect, WebCore::IntRect& result);
    568     void runBeforeUnloadConfirmPanel(const String& message, uint64_t frameID, bool& shouldClose);
    569     void didChangeViewportData(const WebCore::ViewportArguments&);
    570     void pageDidScroll();
    571     void runOpenPanel(uint64_t frameID, const WebOpenPanelParameters::Data&);
    572     void printFrame(uint64_t frameID);
    573     void 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);
    574     void requestGeolocationPermissionForFrame(uint64_t geolocationID, uint64_t frameID, String originIdentifier);
    575     void runModal() { m_uiClient.runModal(this); }
    576     void didCompleteRubberBandForMainFrame(const WebCore::IntSize&);
    577     void didChangeScrollbarsForMainFrame(bool hasHorizontalScrollbar, bool hasVerticalScrollbar);
    578     void didChangeScrollOffsetPinningForMainFrame(bool pinnedToLeftSide, bool pinnedToRightSide);
    579 
    580     void reattachToWebProcess();
    581     void reattachToWebProcessWithItem(WebBackForwardListItem*);
    582 
    583 #if ENABLE(TILED_BACKING_STORE)
    584     void pageDidRequestScroll(const WebCore::IntPoint&);
    585 #endif
    586 
    587 #if PLATFORM(QT)
    588     void didChangeContentsSize(const WebCore::IntSize&);
    589     void didFindZoomableArea(const WebCore::IntRect&);
    590 #endif
    591 
    592     void editorStateChanged(const EditorState&);
    593 
    594     // Back/Forward list management
    595     void backForwardAddItem(uint64_t itemID);
    596     void backForwardGoToItem(uint64_t itemID);
    597     void backForwardItemAtIndex(int32_t index, uint64_t& itemID);
    598     void backForwardBackListCount(int32_t& count);
    599     void backForwardForwardListCount(int32_t& count);
    600     void backForwardClear();
    601 
    602     // Undo management
    603     void registerEditCommandForUndo(uint64_t commandID, uint32_t editAction);
    604     void clearAllEditCommands();
    605     void canUndoRedo(uint32_t action, bool& result);
    606     void executeUndoRedo(uint32_t action, bool& result);
    607 
    608     // Keyboard handling
    609 #if PLATFORM(MAC)
    610     void interpretQueuedKeyEvent(const EditorState&, bool& handled, Vector<WebCore::KeypressCommand>&);
    611     void executeSavedCommandBySelector(const String& selector, bool& handled);
    612 #endif
    613 
    614 #if PLATFORM(GTK)
    615     void getEditorCommandsForKeyEvent(Vector<String>&);
    616 #endif
    617 
    618     // Popup Menu.
    619     void showPopupMenu(const WebCore::IntRect& rect, uint64_t textDirection, const Vector<WebPopupItem>& items, int32_t selectedIndex, const PlatformPopupMenuData&);
    620     void hidePopupMenu();
    621 #if PLATFORM(WIN)
    622     void setPopupMenuSelectedIndex(int32_t);
    623 #endif
    624 
    625     // Context Menu.
    626     void showContextMenu(const WebCore::IntPoint& menuLocation, const ContextMenuState&, const Vector<WebContextMenuItemData>&, CoreIPC::ArgumentDecoder*);
    627     void internalShowContextMenu(const WebCore::IntPoint& menuLocation, const ContextMenuState&, const Vector<WebContextMenuItemData>&, CoreIPC::ArgumentDecoder*);
    628 
    629     // Search popup results
    630     void saveRecentSearches(const String&, const Vector<String>&);
    631     void loadRecentSearches(const String&, Vector<String>&);
    632 
    633 #if PLATFORM(MAC)
    634     // Speech.
    635     void getIsSpeaking(bool&);
    636     void speak(const String&);
    637     void stopSpeaking();
    638 
    639     // Spotlight.
    640     void searchWithSpotlight(const String&);
    641 
    642     // Dictionary.
    643     void didPerformDictionaryLookup(const String&, const DictionaryPopupInfo&);
    644 #endif
    645 
    646     // Spelling and grammar.
    647     int64_t spellDocumentTag();
    648 #if USE(UNIFIED_TEXT_CHECKING)
    649     void checkTextOfParagraph(const String& text, uint64_t checkingTypes, Vector<WebCore::TextCheckingResult>& results);
    650 #endif
    651     void checkSpellingOfString(const String& text, int32_t& misspellingLocation, int32_t& misspellingLength);
    652     void checkGrammarOfString(const String& text, Vector<WebCore::GrammarDetail>&, int32_t& badGrammarLocation, int32_t& badGrammarLength);
    653     void spellingUIIsShowing(bool&);
    654     void updateSpellingUIWithMisspelledWord(const String& misspelledWord);
    655     void updateSpellingUIWithGrammarString(const String& badGrammarPhrase, const WebCore::GrammarDetail&);
    656     void getGuessesForWord(const String& word, const String& context, Vector<String>& guesses);
    657     void learnWord(const String& word);
    658     void ignoreWord(const String& word);
    659 
    660     void setFocus(bool focused);
    661     void takeFocus(uint32_t direction);
    662     void setToolTip(const String&);
    663     void setCursor(const WebCore::Cursor&);
    664 
    665     void didReceiveEvent(uint32_t opaqueType, bool handled);
    666 
    667     void voidCallback(uint64_t);
    668     void dataCallback(const CoreIPC::DataReference&, uint64_t);
    669     void stringCallback(const String&, uint64_t);
    670     void scriptValueCallback(const CoreIPC::DataReference&, uint64_t);
    671     void computedPagesCallback(const Vector<WebCore::IntRect>&, double totalScaleFactorForPrinting, uint64_t);
    672     void validateCommandCallback(const String&, bool, int, uint64_t);
    673 
    674     void focusedFrameChanged(uint64_t frameID);
    675     void frameSetLargestFrameChanged(uint64_t frameID);
    676 
    677     void canAuthenticateAgainstProtectionSpaceInFrame(uint64_t frameID, const WebCore::ProtectionSpace&, bool& canAuthenticate);
    678     void didReceiveAuthenticationChallenge(uint64_t frameID, const WebCore::AuthenticationChallenge&, uint64_t challengeID);
    679 
    680     void didFinishLoadingDataForCustomRepresentation(const String& suggestedFilename, const CoreIPC::DataReference&);
    681 
    682 #if PLATFORM(MAC)
    683     void setComplexTextInputEnabled(uint64_t pluginComplexTextInputIdentifier, bool complexTextInputEnabled);
    684 #endif
    685 
    686     static String standardUserAgent(const String& applicationName = String());
    687 
    688     void clearPendingAPIRequestURL() { m_pendingAPIRequestURL = String(); }
    689     void setPendingAPIRequestURL(const String& pendingAPIRequestURL) { m_pendingAPIRequestURL = pendingAPIRequestURL; }
    690 
    691     void initializeSandboxExtensionHandle(const WebCore::KURL&, SandboxExtension::Handle&);
    692 
    693 #if PLATFORM(MAC)
    694     void substitutionsPanelIsShowing(bool&);
    695 #if !defined(BUILDING_ON_SNOW_LEOPARD)
    696     void showCorrectionPanel(int32_t panelType, const WebCore::FloatRect& boundingBoxOfReplacedString, const String& replacedString, const String& replacementString, const Vector<String>& alternativeReplacementStrings);
    697     void dismissCorrectionPanel(int32_t reason);
    698     void dismissCorrectionPanelSoon(int32_t reason, String& result);
    699     void recordAutocorrectionResponse(int32_t responseType, const String& replacedString, const String& replacementString);
    700 #endif // !defined(BUILDING_ON_SNOW_LEOPARD)
    701 #endif // PLATFORM(MAC)
    702 
    703     void clearLoadDependentCallbacks();
    704 
    705     void performDragControllerAction(DragControllerAction, WebCore::DragData*, const String& dragStorageName, const SandboxExtension::Handle&);
    706 
    707     PageClient* m_pageClient;
    708     WebLoaderClient m_loaderClient;
    709     WebPolicyClient m_policyClient;
    710     WebFormClient m_formClient;
    711     WebResourceLoadClient m_resourceLoadClient;
    712     WebUIClient m_uiClient;
    713     WebFindClient m_findClient;
    714     WebPageContextMenuClient m_contextMenuClient;
    715 
    716     OwnPtr<DrawingAreaProxy> m_drawingArea;
    717     RefPtr<WebProcessProxy> m_process;
    718     RefPtr<WebPageGroup> m_pageGroup;
    719     RefPtr<WebFrameProxy> m_mainFrame;
    720     RefPtr<WebFrameProxy> m_focusedFrame;
    721     RefPtr<WebFrameProxy> m_frameSetLargestFrame;
    722 
    723     String m_userAgent;
    724     String m_applicationNameForUserAgent;
    725     String m_customUserAgent;
    726     String m_customTextEncodingName;
    727 
    728 #if ENABLE(INSPECTOR)
    729     RefPtr<WebInspectorProxy> m_inspector;
    730 #endif
    731 
    732 #if ENABLE(FULLSCREEN_API)
    733     RefPtr<WebFullScreenManagerProxy> m_fullScreenManager;
    734 #endif
    735 
    736     HashMap<uint64_t, RefPtr<VoidCallback> > m_voidCallbacks;
    737     HashMap<uint64_t, RefPtr<DataCallback> > m_dataCallbacks;
    738     HashMap<uint64_t, RefPtr<StringCallback> > m_stringCallbacks;
    739     HashSet<uint64_t> m_loadDependentStringCallbackIDs;
    740     HashMap<uint64_t, RefPtr<ScriptValueCallback> > m_scriptValueCallbacks;
    741     HashMap<uint64_t, RefPtr<ComputedPagesCallback> > m_computedPagesCallbacks;
    742     HashMap<uint64_t, RefPtr<ValidateCommandCallback> > m_validateCommandCallbacks;
    743 
    744     HashSet<WebEditCommandProxy*> m_editCommandSet;
    745 
    746     RefPtr<WebPopupMenuProxy> m_activePopupMenu;
    747     RefPtr<WebContextMenuProxy> m_activeContextMenu;
    748     ContextMenuState m_activeContextMenuState;
    749     RefPtr<WebOpenPanelResultListenerProxy> m_openPanelResultListener;
    750     GeolocationPermissionRequestManagerProxy m_geolocationPermissionRequestManager;
    751 
    752     double m_estimatedProgress;
    753 
    754     // Whether the web page is contained in a top-level window.
    755     bool m_isInWindow;
    756 
    757     // Whether the page is visible; if the backing view is visible and inserted into a window.
    758     bool m_isVisible;
    759 
    760     bool m_canGoBack;
    761     bool m_canGoForward;
    762     RefPtr<WebBackForwardList> m_backForwardList;
    763 
    764     String m_toolTip;
    765 
    766     EditorState m_editorState;
    767 
    768     double m_textZoomFactor;
    769     double m_pageZoomFactor;
    770     double m_viewScaleFactor;
    771 
    772     bool m_drawsBackground;
    773     bool m_drawsTransparentBackground;
    774 
    775     bool m_areMemoryCacheClientCallsEnabled;
    776 
    777     bool m_useFixedLayout;
    778     WebCore::IntSize m_fixedLayoutSize;
    779 
    780     // If the process backing the web page is alive and kicking.
    781     bool m_isValid;
    782 
    783     // Whether WebPageProxy::close() has been called on this page.
    784     bool m_isClosed;
    785 
    786     bool m_isInPrintingMode;
    787     bool m_isPerformingDOMPrintOperation;
    788 
    789     bool m_inDecidePolicyForMIMEType;
    790     bool m_syncMimeTypePolicyActionIsValid;
    791     WebCore::PolicyAction m_syncMimeTypePolicyAction;
    792     uint64_t m_syncMimeTypePolicyDownloadID;
    793 
    794     bool m_inDecidePolicyForNavigationAction;
    795     bool m_syncNavigationActionPolicyActionIsValid;
    796     WebCore::PolicyAction m_syncNavigationActionPolicyAction;
    797     uint64_t m_syncNavigationActionPolicyDownloadID;
    798 
    799     Deque<NativeWebKeyboardEvent> m_keyEventQueue;
    800     bool m_processingWheelEvent;
    801     OwnPtr<WebWheelEvent> m_nextWheelEvent;
    802 
    803     bool m_processingMouseMoveEvent;
    804     OwnPtr<NativeWebMouseEvent> m_nextMouseMoveEvent;
    805     OwnPtr<NativeWebMouseEvent> m_currentlyProcessedMouseDownEvent;
    806 
    807     uint64_t m_pageID;
    808 
    809 #if PLATFORM(MAC)
    810     bool m_isSmartInsertDeleteEnabled;
    811 #endif
    812 
    813     int64_t m_spellDocumentTag;
    814     bool m_hasSpellDocumentTag;
    815     unsigned m_pendingLearnOrIgnoreWordMessageCount;
    816 
    817     bool m_mainFrameHasCustomRepresentation;
    818     WebCore::DragOperation m_currentDragOperation;
    819 
    820     String m_pendingAPIRequestURL;
    821 
    822     bool m_mainFrameHasHorizontalScrollbar;
    823     bool m_mainFrameHasVerticalScrollbar;
    824 
    825     bool m_mainFrameIsPinnedToLeftSide;
    826     bool m_mainFrameIsPinnedToRightSide;
    827 
    828     static WKPageDebugPaintFlags s_debugPaintFlags;
    829 };
    830 
    831 } // namespace WebKit
    832 
    833 #endif // WebPageProxy_h
    834