Home | History | Annotate | Download | only in web
      1 /*
      2  * Copyright (C) 2010 Google 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 are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #ifndef WebViewImpl_h
     32 #define WebViewImpl_h
     33 
     34 #include "core/page/PagePopupDriver.h"
     35 #include "platform/geometry/IntPoint.h"
     36 #include "platform/geometry/IntRect.h"
     37 #include "platform/graphics/GraphicsLayer.h"
     38 #include "public/platform/WebGestureCurveTarget.h"
     39 #include "public/platform/WebLayer.h"
     40 #include "public/platform/WebPoint.h"
     41 #include "public/platform/WebRect.h"
     42 #include "public/platform/WebSize.h"
     43 #include "public/platform/WebString.h"
     44 #include "public/web/WebInputEvent.h"
     45 #include "public/web/WebNavigationPolicy.h"
     46 #include "public/web/WebView.h"
     47 #include "web/BackForwardClientImpl.h"
     48 #include "web/ChromeClientImpl.h"
     49 #include "web/ContextMenuClientImpl.h"
     50 #include "web/DragClientImpl.h"
     51 #include "web/EditorClientImpl.h"
     52 #include "web/InspectorClientImpl.h"
     53 #include "web/MediaKeysClientImpl.h"
     54 #include "web/PageOverlayList.h"
     55 #include "web/PageScaleConstraintsSet.h"
     56 #include "web/PageWidgetDelegate.h"
     57 #include "web/SpellCheckerClientImpl.h"
     58 #include "web/StorageClientImpl.h"
     59 #include "wtf/OwnPtr.h"
     60 #include "wtf/RefCounted.h"
     61 #include "wtf/Vector.h"
     62 
     63 namespace WebCore {
     64 class DataObject;
     65 class Frame;
     66 class RenderLayerCompositor;
     67 class UserGestureToken;
     68 }
     69 
     70 namespace blink {
     71 class LinkHighlight;
     72 class PopupContainer;
     73 class WebActiveGestureAnimation;
     74 class WebDevToolsAgentPrivate;
     75 class WebLocalFrameImpl;
     76 class WebImage;
     77 class WebPagePopupImpl;
     78 class WebPlugin;
     79 class WebSettingsImpl;
     80 class FullscreenController;
     81 
     82 class WebViewImpl FINAL : public WebView
     83     , public RefCounted<WebViewImpl>
     84     , public WebGestureCurveTarget
     85     , public WebCore::PagePopupDriver
     86     , public PageWidgetEventHandler {
     87 public:
     88     static WebViewImpl* create(WebViewClient*);
     89 
     90     // WebWidget methods:
     91     virtual void close() OVERRIDE;
     92     virtual WebSize size() OVERRIDE;
     93     virtual void willStartLiveResize() OVERRIDE;
     94     virtual void resize(const WebSize&) OVERRIDE;
     95     virtual void resizePinchViewport(const WebSize&) OVERRIDE;
     96     virtual void willEndLiveResize() OVERRIDE;
     97     virtual void willEnterFullScreen() OVERRIDE;
     98     virtual void didEnterFullScreen() OVERRIDE;
     99     virtual void willExitFullScreen() OVERRIDE;
    100     virtual void didExitFullScreen() OVERRIDE;
    101     virtual void animate(double) OVERRIDE;
    102     virtual void layout() OVERRIDE;
    103     virtual void paint(WebCanvas*, const WebRect&) OVERRIDE;
    104 #if OS(ANDROID)
    105     virtual void paintCompositedDeprecated(WebCanvas*, const WebRect&) OVERRIDE;
    106 #endif
    107     virtual void compositeAndReadbackAsync(WebCompositeAndReadbackAsyncCallback*) OVERRIDE;
    108     virtual bool isTrackingRepaints() const OVERRIDE;
    109     virtual void themeChanged() OVERRIDE;
    110     virtual bool handleInputEvent(const WebInputEvent&) OVERRIDE;
    111     virtual void setCursorVisibilityState(bool isVisible) OVERRIDE;
    112     virtual bool hasTouchEventHandlersAt(const WebPoint&) OVERRIDE;
    113     virtual void applyScrollAndScale(const WebSize&, float) OVERRIDE;
    114     virtual void mouseCaptureLost() OVERRIDE;
    115     virtual void setFocus(bool enable) OVERRIDE;
    116     virtual bool setComposition(
    117         const WebString& text,
    118         const WebVector<WebCompositionUnderline>& underlines,
    119         int selectionStart,
    120         int selectionEnd) OVERRIDE;
    121     virtual bool confirmComposition() OVERRIDE;
    122     virtual bool confirmComposition(ConfirmCompositionBehavior selectionBehavior) OVERRIDE;
    123     virtual bool confirmComposition(const WebString& text) OVERRIDE;
    124     virtual bool compositionRange(size_t* location, size_t* length) OVERRIDE;
    125     virtual WebTextInputInfo textInputInfo() OVERRIDE;
    126     virtual WebColor backgroundColor() const OVERRIDE;
    127     virtual bool selectionBounds(WebRect& anchor, WebRect& focus) const OVERRIDE;
    128     virtual void didShowCandidateWindow() OVERRIDE;
    129     virtual void didUpdateCandidateWindow() OVERRIDE;
    130     virtual void didHideCandidateWindow() OVERRIDE;
    131     virtual bool selectionTextDirection(WebTextDirection& start, WebTextDirection& end) const OVERRIDE;
    132     virtual bool isSelectionAnchorFirst() const OVERRIDE;
    133     virtual bool caretOrSelectionRange(size_t* location, size_t* length) OVERRIDE;
    134     virtual void setTextDirection(WebTextDirection) OVERRIDE;
    135     virtual bool isAcceleratedCompositingActive() const OVERRIDE;
    136     virtual void willCloseLayerTreeView() OVERRIDE;
    137     virtual void didAcquirePointerLock() OVERRIDE;
    138     virtual void didNotAcquirePointerLock() OVERRIDE;
    139     virtual void didLosePointerLock() OVERRIDE;
    140     virtual void didChangeWindowResizerRect() OVERRIDE;
    141 
    142     // WebView methods:
    143     virtual void setMainFrame(WebFrame*) OVERRIDE;
    144     virtual void setAutofillClient(WebAutofillClient*) OVERRIDE;
    145     virtual void setDevToolsAgentClient(WebDevToolsAgentClient*) OVERRIDE;
    146     virtual void setPrerendererClient(WebPrerendererClient*) OVERRIDE;
    147     virtual void setSpellCheckClient(WebSpellCheckClient*) OVERRIDE;
    148     virtual WebSettings* settings() OVERRIDE;
    149     virtual WebString pageEncoding() const OVERRIDE;
    150     virtual void setPageEncoding(const WebString&) OVERRIDE;
    151     virtual bool isTransparent() const OVERRIDE;
    152     virtual void setIsTransparent(bool value) OVERRIDE;
    153     virtual void setBaseBackgroundColor(WebColor) OVERRIDE;
    154     virtual bool tabsToLinks() const OVERRIDE;
    155     virtual void setTabsToLinks(bool value) OVERRIDE;
    156     virtual bool tabKeyCyclesThroughElements() const OVERRIDE;
    157     virtual void setTabKeyCyclesThroughElements(bool value) OVERRIDE;
    158     virtual bool isActive() const OVERRIDE;
    159     virtual void setIsActive(bool value) OVERRIDE;
    160     virtual void setDomainRelaxationForbidden(bool, const WebString& scheme) OVERRIDE;
    161     virtual void setWindowFeatures(const WebWindowFeatures&) OVERRIDE;
    162     virtual void setOpenedByDOM() OVERRIDE;
    163     virtual WebFrame* mainFrame() OVERRIDE;
    164     virtual WebFrame* findFrameByName(
    165         const WebString& name, WebFrame* relativeToFrame) OVERRIDE;
    166     virtual WebFrame* focusedFrame() OVERRIDE;
    167     virtual void setFocusedFrame(WebFrame*) OVERRIDE;
    168     virtual void setInitialFocus(bool reverse) OVERRIDE;
    169     virtual void clearFocusedElement() OVERRIDE;
    170     virtual void scrollFocusedNodeIntoRect(const WebRect&) OVERRIDE;
    171     virtual void zoomToFindInPageRect(const WebRect&) OVERRIDE;
    172     virtual void advanceFocus(bool reverse) OVERRIDE;
    173     virtual double zoomLevel() OVERRIDE;
    174     virtual double setZoomLevel(double) OVERRIDE;
    175     virtual void zoomLimitsChanged(double minimumZoomLevel, double maximumZoomLevel) OVERRIDE;
    176     virtual float textZoomFactor() OVERRIDE;
    177     virtual float setTextZoomFactor(float) OVERRIDE;
    178     virtual void setInitialPageScaleOverride(float) OVERRIDE;
    179     virtual bool zoomToMultipleTargetsRect(const WebRect&) OVERRIDE;
    180     virtual float pageScaleFactor() const OVERRIDE;
    181     virtual void setPageScaleFactorLimits(float minPageScale, float maxPageScale) OVERRIDE;
    182     virtual void setMainFrameScrollOffset(const WebPoint&) OVERRIDE;
    183     virtual void setPageScaleFactor(float) OVERRIDE;
    184     virtual void setPinchViewportOffset(const WebFloatPoint&) OVERRIDE;
    185     virtual WebFloatPoint pinchViewportOffset() const OVERRIDE;
    186     virtual float minimumPageScaleFactor() const OVERRIDE;
    187     virtual float maximumPageScaleFactor() const OVERRIDE;
    188     virtual void resetScrollAndScaleState() OVERRIDE;
    189     virtual void setIgnoreViewportTagScaleLimits(bool) OVERRIDE;
    190     virtual WebSize contentsPreferredMinimumSize() OVERRIDE;
    191 
    192     virtual float deviceScaleFactor() const OVERRIDE;
    193     virtual void setDeviceScaleFactor(float) OVERRIDE;
    194 
    195     virtual void setFixedLayoutSize(const WebSize&) OVERRIDE;
    196 
    197     virtual void enableAutoResizeMode(
    198         const WebSize& minSize,
    199         const WebSize& maxSize) OVERRIDE;
    200     virtual void disableAutoResizeMode() OVERRIDE;
    201     virtual void performMediaPlayerAction(
    202         const WebMediaPlayerAction& action,
    203         const WebPoint& location) OVERRIDE;
    204     virtual void performPluginAction(
    205         const WebPluginAction&,
    206         const WebPoint&) OVERRIDE;
    207     virtual WebHitTestResult hitTestResultAt(const WebPoint&) OVERRIDE;
    208     virtual void copyImageAt(const WebPoint&) OVERRIDE;
    209     virtual void saveImageAt(const WebPoint&) OVERRIDE;
    210     virtual void dragSourceEndedAt(
    211         const WebPoint& clientPoint,
    212         const WebPoint& screenPoint,
    213         WebDragOperation) OVERRIDE;
    214     virtual void dragSourceSystemDragEnded() OVERRIDE;
    215     virtual WebDragOperation dragTargetDragEnter(
    216         const WebDragData&,
    217         const WebPoint& clientPoint,
    218         const WebPoint& screenPoint,
    219         WebDragOperationsMask operationsAllowed,
    220         int keyModifiers) OVERRIDE;
    221     virtual WebDragOperation dragTargetDragOver(
    222         const WebPoint& clientPoint,
    223         const WebPoint& screenPoint,
    224         WebDragOperationsMask operationsAllowed,
    225         int keyModifiers) OVERRIDE;
    226     virtual void dragTargetDragLeave() OVERRIDE;
    227     virtual void dragTargetDrop(
    228         const WebPoint& clientPoint,
    229         const WebPoint& screenPoint,
    230         int keyModifiers) OVERRIDE;
    231     virtual void spellingMarkers(WebVector<uint32_t>* markers) OVERRIDE;
    232     virtual unsigned long createUniqueIdentifierForRequest() OVERRIDE;
    233     virtual void inspectElementAt(const WebPoint&) OVERRIDE;
    234     virtual WebString inspectorSettings() const OVERRIDE;
    235     virtual void setInspectorSettings(const WebString&) OVERRIDE;
    236     virtual bool inspectorSetting(const WebString& key, WebString* value) const OVERRIDE;
    237     virtual void setInspectorSetting(const WebString& key, const WebString& value) OVERRIDE;
    238     virtual void setCompositorDeviceScaleFactorOverride(float) OVERRIDE;
    239     virtual void setRootLayerTransform(const WebSize& offset, float scale) OVERRIDE;
    240     virtual WebDevToolsAgent* devToolsAgent() OVERRIDE;
    241     virtual WebAXObject accessibilityObject() OVERRIDE;
    242     virtual void setSelectionColors(unsigned activeBackgroundColor,
    243                                     unsigned activeForegroundColor,
    244                                     unsigned inactiveBackgroundColor,
    245                                     unsigned inactiveForegroundColor) OVERRIDE;
    246     virtual void performCustomContextMenuAction(unsigned action) OVERRIDE;
    247     virtual void showContextMenu() OVERRIDE;
    248     // FIXME: This should be removed when the chromium side patch lands
    249     // http://codereview.chromium.org/260623004
    250     virtual WebString getSmartClipData(WebRect) OVERRIDE;
    251     virtual void getSmartClipData(WebRect, WebString&, WebRect&) OVERRIDE;
    252     virtual void extractSmartClipData(WebRect, WebString&, WebString&, WebRect&) OVERRIDE;
    253     virtual void hidePopups() OVERRIDE;
    254     virtual void addPageOverlay(WebPageOverlay*, int /* zOrder */) OVERRIDE;
    255     virtual void removePageOverlay(WebPageOverlay*) OVERRIDE;
    256     virtual void transferActiveWheelFlingAnimation(const WebActiveWheelFlingParameters&) OVERRIDE;
    257     virtual bool endActiveFlingAnimation() OVERRIDE;
    258     virtual void setShowPaintRects(bool) OVERRIDE;
    259     void setShowDebugBorders(bool);
    260     virtual void setShowFPSCounter(bool) OVERRIDE;
    261     virtual void setContinuousPaintingEnabled(bool) OVERRIDE;
    262     virtual void setShowScrollBottleneckRects(bool) OVERRIDE;
    263     virtual void getSelectionRootBounds(WebRect& bounds) const OVERRIDE;
    264     virtual void acceptLanguagesChanged() OVERRIDE;
    265 
    266     // WebViewImpl
    267 
    268     void suppressInvalidations(bool enable);
    269     void invalidateRect(const WebCore::IntRect&);
    270 
    271     void setIgnoreInputEvents(bool newValue);
    272     void setBackgroundColorOverride(WebColor);
    273     void setZoomFactorOverride(float);
    274     WebDevToolsAgentPrivate* devToolsAgentPrivate() { return m_devToolsAgent.get(); }
    275 
    276     WebCore::Color baseBackgroundColor() const { return m_baseBackgroundColor; }
    277 
    278     PageOverlayList* pageOverlays() const { return m_pageOverlays.get(); }
    279 
    280     void setOverlayLayer(WebCore::GraphicsLayer*);
    281 
    282     const WebPoint& lastMouseDownPoint() const
    283     {
    284         return m_lastMouseDownPoint;
    285     }
    286 
    287     WebCore::Frame* focusedWebCoreFrame() const;
    288 
    289     // Returns the currently focused Element or null if no element has focus.
    290     WebCore::Element* focusedElement() const;
    291 
    292     static WebViewImpl* fromPage(WebCore::Page*);
    293 
    294     WebViewClient* client()
    295     {
    296         return m_client;
    297     }
    298 
    299     WebAutofillClient* autofillClient()
    300     {
    301         return m_autofillClient;
    302     }
    303 
    304     WebSpellCheckClient* spellCheckClient()
    305     {
    306         return m_spellCheckClient;
    307     }
    308 
    309     // Returns the page object associated with this view. This may be null when
    310     // the page is shutting down, but will be valid at all other times.
    311     WebCore::Page* page() const
    312     {
    313         return m_page.get();
    314     }
    315 
    316     // Returns the main frame associated with this view. This may be null when
    317     // the page is shutting down, but will be valid at all other times.
    318     WebLocalFrameImpl* mainFrameImpl();
    319 
    320     // Event related methods:
    321     void mouseContextMenu(const WebMouseEvent&);
    322     void mouseDoubleClick(const WebMouseEvent&);
    323 
    324     bool detectContentOnTouch(const WebPoint&);
    325     bool startPageScaleAnimation(const WebCore::IntPoint& targetPosition, bool useAnchor, float newScale, double durationInSeconds);
    326 
    327     void hasTouchEventHandlers(bool);
    328 
    329     // WebGestureCurveTarget implementation for fling.
    330     virtual bool scrollBy(const WebFloatSize& delta, const WebFloatSize& velocity) OVERRIDE;
    331 
    332     // Handles context menu events orignated via the the keyboard. These
    333     // include the VK_APPS virtual key and the Shift+F10 combine. Code is
    334     // based on the Webkit function bool WebView::handleContextMenuEvent(WPARAM
    335     // wParam, LPARAM lParam) in webkit\webkit\win\WebView.cpp. The only
    336     // significant change in this function is the code to convert from a
    337     // Keyboard event to the Right Mouse button down event.
    338     bool sendContextMenuEvent(const WebKeyboardEvent&);
    339 
    340     // Notifies the WebView that a load has been committed. isNewNavigation
    341     // will be true if a new session history item should be created for that
    342     // load. isNavigationWithinPage will be true if the navigation does
    343     // not take the user away from the current page.
    344     void didCommitLoad(bool isNewNavigation, bool isNavigationWithinPage);
    345 
    346     // Indicates two things:
    347     //   1) This view may have a new layout now.
    348     //   2) Calling layout() is a no-op.
    349     // After calling WebWidget::layout(), expect to get this notification
    350     // unless the view did not need a layout.
    351     void layoutUpdated(WebLocalFrameImpl*);
    352 
    353     void willInsertBody(WebLocalFrameImpl*);
    354     void didChangeContentsSize();
    355     void deviceOrPageScaleFactorChanged();
    356 
    357     // Returns true if popup menus should be rendered by the browser, false if
    358     // they should be rendered by WebKit (which is the default).
    359     static bool useExternalPopupMenus();
    360 
    361     bool contextMenuAllowed() const
    362     {
    363         return m_contextMenuAllowed;
    364     }
    365 
    366     bool shouldAutoResize() const
    367     {
    368         return m_shouldAutoResize;
    369     }
    370 
    371     WebCore::IntSize minAutoSize() const
    372     {
    373         return m_minAutoSize;
    374     }
    375 
    376     WebCore::IntSize maxAutoSize() const
    377     {
    378         return m_maxAutoSize;
    379     }
    380 
    381     void updateMainFrameLayoutSize();
    382     void updatePageDefinedViewportConstraints(const WebCore::ViewportDescription&);
    383 
    384     // Start a system drag and drop operation.
    385     void startDragging(
    386         WebCore::LocalFrame*,
    387         const WebDragData& dragData,
    388         WebDragOperationsMask mask,
    389         const WebImage& dragImage,
    390         const WebPoint& dragImageOffset);
    391 
    392     // Tries to scroll the currently focused element and bubbles up through the
    393     // DOM and frame hierarchies. Returns true if something was scrolled.
    394     bool bubblingScroll(WebCore::ScrollDirection, WebCore::ScrollGranularity);
    395 
    396     // Notification that a popup was opened/closed.
    397     void popupOpened(PopupContainer*);
    398     void popupClosed(PopupContainer*);
    399     // PagePopupDriver functions.
    400     virtual WebCore::PagePopup* openPagePopup(WebCore::PagePopupClient*, const WebCore::IntRect& originBoundsInRootView) OVERRIDE;
    401     virtual void closePagePopup(WebCore::PagePopup*) OVERRIDE;
    402 
    403     // Returns the input event we're currently processing. This is used in some
    404     // cases where the WebCore DOM event doesn't have the information we need.
    405     static const WebInputEvent* currentInputEvent()
    406     {
    407         return m_currentInputEvent;
    408     }
    409 
    410     WebCore::GraphicsLayer* rootGraphicsLayer();
    411     void setRootGraphicsLayer(WebCore::GraphicsLayer*);
    412     void scheduleCompositingLayerSync();
    413     void scrollRootLayer();
    414     WebCore::GraphicsLayerFactory* graphicsLayerFactory() const;
    415     WebCore::RenderLayerCompositor* compositor() const;
    416     void registerForAnimations(WebLayer*);
    417     void scheduleAnimation();
    418 
    419     virtual void setVisibilityState(WebPageVisibilityState, bool) OVERRIDE;
    420 
    421     PopupContainer* selectPopup() const { return m_selectPopup.get(); }
    422     bool hasOpenedPopup() const { return m_selectPopup || m_pagePopup; }
    423 
    424     // Returns true if the event leads to scrolling.
    425     static bool mapKeyCodeForScroll(int keyCode,
    426                                    WebCore::ScrollDirection* scrollDirection,
    427                                    WebCore::ScrollGranularity* scrollGranularity);
    428 
    429     // Called by a full frame plugin inside this view to inform it that its
    430     // zoom level has been updated.  The plugin should only call this function
    431     // if the zoom change was triggered by the browser, it's only needed in case
    432     // a plugin can update its own zoom, say because of its own UI.
    433     void fullFramePluginZoomLevelChanged(double zoomLevel);
    434 
    435     void computeScaleAndScrollForBlockRect(const WebPoint& hitPoint, const WebRect& blockRect, float padding, float defaultScaleWhenAlreadyLegible, float& scale, WebPoint& scroll);
    436     WebCore::Node* bestTapNode(const WebCore::PlatformGestureEvent& tapEvent);
    437     void enableTapHighlightAtPoint(const WebCore::PlatformGestureEvent& tapEvent);
    438     void enableTapHighlights(WillBeHeapVector<RawPtrWillBeMember<WebCore::Node> >&);
    439     void computeScaleAndScrollForFocusedNode(WebCore::Node* focusedNode, float& scale, WebCore::IntPoint& scroll, bool& needAnimation);
    440 
    441     void animateDoubleTapZoom(const WebCore::IntPoint&);
    442 
    443     void enableFakePageScaleAnimationForTesting(bool);
    444     bool fakeDoubleTapAnimationPendingForTesting() const { return m_doubleTapZoomPending; }
    445     WebCore::IntPoint fakePageScaleAnimationTargetPositionForTesting() const { return m_fakePageScaleAnimationTargetPosition; }
    446     float fakePageScaleAnimationPageScaleForTesting() const { return m_fakePageScaleAnimationPageScaleFactor; }
    447     bool fakePageScaleAnimationUseAnchorForTesting() const { return m_fakePageScaleAnimationUseAnchor; }
    448 
    449     void enterFullScreenForElement(WebCore::Element*);
    450     void exitFullScreenForElement(WebCore::Element*);
    451 
    452     // Exposed for the purpose of overriding device metrics.
    453     void sendResizeEventAndRepaint();
    454 
    455     // Exposed for testing purposes.
    456     bool hasHorizontalScrollbar();
    457     bool hasVerticalScrollbar();
    458 
    459     // Pointer Lock calls allow a page to capture all mouse events and
    460     // disable the system cursor.
    461     bool requestPointerLock();
    462     void requestPointerUnlock();
    463     bool isPointerLocked();
    464 
    465     // Heuristic-based function for determining if we should disable workarounds
    466     // for viewing websites that are not optimized for mobile devices.
    467     bool shouldDisableDesktopWorkarounds();
    468 
    469     // Exposed for tests.
    470     unsigned numLinkHighlights() { return m_linkHighlights.size(); }
    471     LinkHighlight* linkHighlight(int i) { return m_linkHighlights[i].get(); }
    472 
    473     WebSettingsImpl* settingsImpl();
    474 
    475     // Returns the bounding box of the block type node touched by the WebRect.
    476     WebRect computeBlockBounds(const WebRect&, bool ignoreClipping);
    477 
    478     WebCore::IntPoint clampOffsetAtScale(const WebCore::IntPoint& offset, float scale);
    479 
    480     // Exposed for tests.
    481     WebVector<WebCompositionUnderline> compositionUnderlines() const;
    482 
    483     WebLayerTreeView* layerTreeView() const { return m_layerTreeView; }
    484 
    485     bool pinchVirtualViewportEnabled() const;
    486 
    487     bool matchesHeuristicsForGpuRasterizationForTesting() const { return m_matchesHeuristicsForGpuRasterization; }
    488 
    489 private:
    490     // TODO(bokan): Remains for legacy pinch. Remove once it's gone. Made private to
    491     // prevent external usage
    492     virtual void setPageScaleFactor(float scaleFactor, const WebPoint& origin) OVERRIDE;
    493 
    494     float legibleScale() const;
    495     void refreshPageScaleFactorAfterLayout();
    496     void resumeTreeViewCommits();
    497     void setUserAgentPageScaleConstraints(WebCore::PageScaleConstraints newConstraints);
    498     float clampPageScaleFactorToLimits(float) const;
    499     WebCore::IntSize contentsSize() const;
    500 
    501     void resetSavedScrollAndScaleState();
    502 
    503     void updateMainFrameScrollPosition(const WebCore::IntPoint& scrollPosition, bool programmaticScroll);
    504 
    505     friend class WebView;  // So WebView::Create can call our constructor
    506     friend class WTF::RefCounted<WebViewImpl>;
    507     friend void setCurrentInputEventForTest(const WebInputEvent*);
    508 
    509     enum DragAction {
    510       DragEnter,
    511       DragOver
    512     };
    513 
    514     explicit WebViewImpl(WebViewClient*);
    515     virtual ~WebViewImpl();
    516 
    517     WebTextInputType textInputType();
    518 
    519     WebString inputModeOfFocusedElement();
    520 
    521     // Returns true if the event was actually processed.
    522     bool keyEventDefault(const WebKeyboardEvent&);
    523 
    524     bool confirmComposition(const WebString& text, ConfirmCompositionBehavior);
    525 
    526     // Returns true if the view was scrolled.
    527     bool scrollViewWithKeyboard(int keyCode, int modifiers);
    528 
    529     void hideSelectPopup();
    530 
    531     // Converts |pos| from window coordinates to contents coordinates and gets
    532     // the HitTestResult for it.
    533     WebCore::HitTestResult hitTestResultForWindowPos(const WebCore::IntPoint&);
    534 
    535     // Consolidate some common code between starting a drag over a target and
    536     // updating a drag over a target. If we're starting a drag, |isEntering|
    537     // should be true.
    538     WebDragOperation dragTargetDragEnterOrOver(const WebPoint& clientPoint,
    539                                                const WebPoint& screenPoint,
    540                                                DragAction,
    541                                                int keyModifiers);
    542 
    543     void configureAutoResizeMode();
    544 
    545     void setIsAcceleratedCompositingActive(bool);
    546     void doComposite();
    547     void reallocateRenderer();
    548     void updateLayerTreeViewport();
    549     void updateLayerTreeBackgroundColor();
    550     void updateRootLayerTransform();
    551     void updateLayerTreeDeviceScaleFactor();
    552 
    553     // Helper function: Widens the width of |source| by the specified margins
    554     // while keeping it smaller than page width.
    555     WebRect widenRectWithinPageBounds(const WebRect& source, int targetMargin, int minimumMargin);
    556 
    557     void pointerLockMouseEvent(const WebInputEvent&);
    558 
    559     // PageWidgetEventHandler functions
    560     virtual void handleMouseLeave(WebCore::LocalFrame&, const WebMouseEvent&) OVERRIDE;
    561     virtual void handleMouseDown(WebCore::LocalFrame&, const WebMouseEvent&) OVERRIDE;
    562     virtual void handleMouseUp(WebCore::LocalFrame&, const WebMouseEvent&) OVERRIDE;
    563     virtual bool handleMouseWheel(WebCore::LocalFrame&, const WebMouseWheelEvent&) OVERRIDE;
    564     virtual bool handleGestureEvent(const WebGestureEvent&) OVERRIDE;
    565     virtual bool handleKeyEvent(const WebKeyboardEvent&) OVERRIDE;
    566     virtual bool handleCharEvent(const WebKeyboardEvent&) OVERRIDE;
    567 
    568     WebCore::InputMethodContext* inputMethodContext();
    569     WebPlugin* focusedPluginIfInputMethodSupported(WebCore::LocalFrame*);
    570 
    571     WebViewClient* m_client; // Can be 0 (e.g. unittests, shared workers, etc.)
    572     WebAutofillClient* m_autofillClient;
    573     WebSpellCheckClient* m_spellCheckClient;
    574 
    575     ChromeClientImpl m_chromeClientImpl;
    576     ContextMenuClientImpl m_contextMenuClientImpl;
    577     DragClientImpl m_dragClientImpl;
    578     EditorClientImpl m_editorClientImpl;
    579     InspectorClientImpl m_inspectorClientImpl;
    580     BackForwardClientImpl m_backForwardClientImpl;
    581     SpellCheckerClientImpl m_spellCheckerClientImpl;
    582     StorageClientImpl m_storageClientImpl;
    583 
    584     WebSize m_size;
    585     bool m_fixedLayoutSizeLock;
    586     // If true, automatically resize the render view around its content.
    587     bool m_shouldAutoResize;
    588     // The lower bound on the size when auto-resizing.
    589     WebCore::IntSize m_minAutoSize;
    590     // The upper bound on the size when auto-resizing.
    591     WebCore::IntSize m_maxAutoSize;
    592 
    593     OwnPtrWillBePersistent<WebCore::Page> m_page;
    594 
    595     // An object that can be used to manipulate m_page->settings() without linking
    596     // against WebCore. This is lazily allocated the first time GetWebSettings()
    597     // is called.
    598     OwnPtr<WebSettingsImpl> m_webSettings;
    599 
    600     // A copy of the web drop data object we received from the browser.
    601     RefPtrWillBePersistent<WebCore::DataObject> m_currentDragData;
    602 
    603     // The point relative to the client area where the mouse was last pressed
    604     // down. This is used by the drag client to determine what was under the
    605     // mouse when the drag was initiated. We need to track this here in
    606     // WebViewImpl since DragClient::startDrag does not pass the position the
    607     // mouse was at when the drag was initiated, only the current point, which
    608     // can be misleading as it is usually not over the element the user actually
    609     // dragged by the time a drag is initiated.
    610     WebPoint m_lastMouseDownPoint;
    611 
    612     // Keeps track of the current zoom level. 0 means no zoom, positive numbers
    613     // mean zoom in, negative numbers mean zoom out.
    614     double m_zoomLevel;
    615 
    616     double m_minimumZoomLevel;
    617 
    618     double m_maximumZoomLevel;
    619 
    620     PageScaleConstraintsSet m_pageScaleConstraintsSet;
    621 
    622     // The scale moved to by the latest double tap zoom, if any.
    623     float m_doubleTapZoomPageScaleFactor;
    624     // Have we sent a double-tap zoom and not yet heard back the scale?
    625     bool m_doubleTapZoomPending;
    626 
    627     // Used for testing purposes.
    628     bool m_enableFakePageScaleAnimationForTesting;
    629     WebCore::IntPoint m_fakePageScaleAnimationTargetPosition;
    630     float m_fakePageScaleAnimationPageScaleFactor;
    631     bool m_fakePageScaleAnimationUseAnchor;
    632 
    633     bool m_contextMenuAllowed;
    634 
    635     bool m_doingDragAndDrop;
    636 
    637     bool m_ignoreInputEvents;
    638 
    639     float m_compositorDeviceScaleFactorOverride;
    640     WebSize m_rootLayerOffset;
    641     float m_rootLayerScale;
    642 
    643     // Webkit expects keyPress events to be suppressed if the associated keyDown
    644     // event was handled. Safari implements this behavior by peeking out the
    645     // associated WM_CHAR event if the keydown was handled. We emulate
    646     // this behavior by setting this flag if the keyDown was handled.
    647     bool m_suppressNextKeypressEvent;
    648 
    649     // Represents whether or not this object should process incoming IME events.
    650     bool m_imeAcceptEvents;
    651 
    652     // The available drag operations (copy, move link...) allowed by the source.
    653     WebDragOperation m_operationsAllowed;
    654 
    655     // The current drag operation as negotiated by the source and destination.
    656     // When not equal to DragOperationNone, the drag data can be dropped onto the
    657     // current drop target in this WebView (the drop target can accept the drop).
    658     WebDragOperation m_dragOperation;
    659 
    660     // The popup associated with a select element.
    661     RefPtr<PopupContainer> m_selectPopup;
    662 
    663     // The popup associated with an input element.
    664     RefPtr<WebPagePopupImpl> m_pagePopup;
    665 
    666     OwnPtr<WebDevToolsAgentPrivate> m_devToolsAgent;
    667     OwnPtr<PageOverlayList> m_pageOverlays;
    668 
    669     // Whether the webview is rendering transparently.
    670     bool m_isTransparent;
    671 
    672     // Whether the user can press tab to focus links.
    673     bool m_tabsToLinks;
    674 
    675     // Inspector settings.
    676     WebString m_inspectorSettings;
    677 
    678     typedef HashMap<WTF::String, WTF::String> SettingsMap;
    679     OwnPtr<SettingsMap> m_inspectorSettingsMap;
    680 
    681     // If set, the (plugin) node which has mouse capture.
    682     RefPtrWillBePersistent<WebCore::Node> m_mouseCaptureNode;
    683     RefPtr<WebCore::UserGestureToken> m_mouseCaptureGestureToken;
    684 
    685     WebCore::IntRect m_rootLayerScrollDamage;
    686     WebLayerTreeView* m_layerTreeView;
    687     WebLayer* m_rootLayer;
    688     WebCore::GraphicsLayer* m_rootGraphicsLayer;
    689     WebCore::GraphicsLayer* m_rootTransformLayer;
    690     OwnPtr<WebCore::GraphicsLayerFactory> m_graphicsLayerFactory;
    691     bool m_isAcceleratedCompositingActive;
    692     bool m_layerTreeViewCommitsDeferred;
    693     bool m_matchesHeuristicsForGpuRasterization;
    694     // If true, the graphics context is being restored.
    695     bool m_recreatingGraphicsContext;
    696     static const WebInputEvent* m_currentInputEvent;
    697 
    698     MediaKeysClientImpl m_mediaKeysClientImpl;
    699     OwnPtr<WebActiveGestureAnimation> m_gestureAnimation;
    700     WebPoint m_positionOnFlingStart;
    701     WebPoint m_globalPositionOnFlingStart;
    702     int m_flingModifier;
    703     bool m_flingSourceDevice;
    704     Vector<OwnPtr<LinkHighlight> > m_linkHighlights;
    705     OwnPtr<FullscreenController> m_fullscreenController;
    706 
    707     bool m_showFPSCounter;
    708     bool m_showPaintRects;
    709     bool m_showDebugBorders;
    710     bool m_continuousPaintingEnabled;
    711     bool m_showScrollBottleneckRects;
    712     WebColor m_baseBackgroundColor;
    713     WebColor m_backgroundColorOverride;
    714     float m_zoomFactorOverride;
    715 
    716     bool m_userGestureObserved;
    717 };
    718 
    719 // We have no ways to check if the specified WebView is an instance of
    720 // WebViewImpl because WebViewImpl is the only implementation of WebView.
    721 DEFINE_TYPE_CASTS(WebViewImpl, WebView, webView, true, true);
    722 
    723 } // namespace blink
    724 
    725 #endif
    726