summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/web/WebViewImpl.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/web/WebViewImpl.h')
-rw-r--r--chromium/third_party/WebKit/Source/web/WebViewImpl.h837
1 files changed, 837 insertions, 0 deletions
diff --git a/chromium/third_party/WebKit/Source/web/WebViewImpl.h b/chromium/third_party/WebKit/Source/web/WebViewImpl.h
new file mode 100644
index 00000000000..03795c80ce2
--- /dev/null
+++ b/chromium/third_party/WebKit/Source/web/WebViewImpl.h
@@ -0,0 +1,837 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebViewImpl_h
+#define WebViewImpl_h
+
+#include "BackForwardClientImpl.h"
+#include "ChromeClientImpl.h"
+#include "ContextMenuClientImpl.h"
+#include "DragClientImpl.h"
+#include "EditorClientImpl.h"
+#include "InspectorClientImpl.h"
+#include "MIDIClientImpl.h"
+#include "NotificationPresenterImpl.h"
+#include "PageOverlayList.h"
+#include "PageWidgetDelegate.h"
+#include "UserMediaClientImpl.h"
+#include "WebInputEvent.h"
+#include "WebNavigationPolicy.h"
+#include "WebView.h"
+#include "WebViewBenchmarkSupportImpl.h"
+#include "core/page/PagePopupDriver.h"
+#include "core/page/PageScaleConstraintsSet.h"
+#include "core/platform/graphics/FloatSize.h"
+#include "core/platform/graphics/GraphicsContext3D.h"
+#include "core/platform/graphics/GraphicsLayer.h"
+#include "core/platform/graphics/IntPoint.h"
+#include "core/platform/graphics/IntRect.h"
+#include "public/platform/WebFloatQuad.h"
+#include "public/platform/WebGestureCurveTarget.h"
+#include "public/platform/WebLayer.h"
+#include "public/platform/WebPoint.h"
+#include "public/platform/WebRect.h"
+#include "public/platform/WebSize.h"
+#include "public/platform/WebString.h"
+#include "wtf/OwnPtr.h"
+#include "wtf/RefCounted.h"
+
+namespace WebCore {
+class ChromiumDataObject;
+class Color;
+class DocumentLoader;
+class FloatSize;
+class Frame;
+class GraphicsContext3D;
+class GraphicsLayerFactory;
+class HistoryItem;
+class HitTestResult;
+class KeyboardEvent;
+class Page;
+class PageGroup;
+class PagePopup;
+class PagePopupClient;
+class PlatformKeyboardEvent;
+class PopupContainer;
+class PopupMenuClient;
+class Range;
+class RenderLayerCompositor;
+class RenderTheme;
+class Widget;
+}
+
+namespace WebKit {
+class AutocompletePopupMenuClient;
+class AutofillPopupMenuClient;
+class ContextFeaturesClientImpl;
+class ContextMenuClientImpl;
+class DeviceOrientationClientProxy;
+class GeolocationClientProxy;
+class LinkHighlight;
+class PinchViewports;
+class PrerendererClientImpl;
+class SpeechInputClientImpl;
+class SpeechRecognitionClientProxy;
+class UserMediaClientImpl;
+class ValidationMessageClientImpl;
+class WebAccessibilityObject;
+class WebActiveGestureAnimation;
+class WebCompositorImpl;
+class WebDevToolsAgentClient;
+class WebDevToolsAgentPrivate;
+class WebDocument;
+class WebFrameImpl;
+class WebGestureEvent;
+class WebHelperPluginImpl;
+class WebImage;
+class WebKeyboardEvent;
+class WebLayerTreeView;
+class WebMouseEvent;
+class WebMouseWheelEvent;
+class WebPagePopupImpl;
+class WebPrerendererClient;
+class WebSettingsImpl;
+class WebTouchEvent;
+class WebViewBenchmarkSupport;
+class FullscreenController;
+
+class WebViewImpl : public WebView
+ , public RefCounted<WebViewImpl>
+ , public WebGestureCurveTarget
+ , public WebCore::PagePopupDriver
+ , public PageWidgetEventHandler {
+public:
+
+ // WebWidget methods:
+ virtual void close();
+ virtual WebSize size();
+ virtual void willStartLiveResize();
+ virtual void resize(const WebSize&);
+ virtual void willEndLiveResize();
+ virtual void willEnterFullScreen();
+ virtual void didEnterFullScreen();
+ virtual void willExitFullScreen();
+ virtual void didExitFullScreen();
+ virtual void animate(double);
+ virtual void layout();
+ virtual void enterForceCompositingMode(bool enable) OVERRIDE;
+ virtual void paint(WebCanvas*, const WebRect&, PaintOptions = ReadbackFromCompositorIfAvailable);
+ virtual bool isTrackingRepaints() const OVERRIDE;
+ virtual void themeChanged();
+ virtual void setNeedsRedraw();
+ virtual bool handleInputEvent(const WebInputEvent&);
+ virtual void setCursorVisibilityState(bool isVisible);
+ virtual bool hasTouchEventHandlersAt(const WebPoint&);
+ virtual void applyScrollAndScale(const WebSize&, float);
+ virtual void mouseCaptureLost();
+ virtual void setFocus(bool enable);
+ virtual bool setComposition(
+ const WebString& text,
+ const WebVector<WebCompositionUnderline>& underlines,
+ int selectionStart,
+ int selectionEnd);
+ virtual bool confirmComposition();
+ virtual bool confirmComposition(ConfirmCompositionBehavior selectionBehavior);
+ virtual bool confirmComposition(const WebString& text);
+ virtual bool compositionRange(size_t* location, size_t* length);
+ virtual WebTextInputInfo textInputInfo();
+ virtual bool setEditableSelectionOffsets(int start, int end);
+ virtual bool setCompositionFromExistingText(int compositionStart, int compositionEnd, const WebVector<WebCompositionUnderline>& underlines);
+ virtual void extendSelectionAndDelete(int before, int after);
+ virtual bool isSelectionEditable() const;
+ virtual WebColor backgroundColor() const;
+ virtual bool selectionBounds(WebRect& anchor, WebRect& focus) const;
+ virtual bool selectionTextDirection(WebTextDirection& start, WebTextDirection& end) const;
+ virtual bool isSelectionAnchorFirst() const;
+ virtual bool caretOrSelectionRange(size_t* location, size_t* length);
+ virtual void setTextDirection(WebTextDirection direction);
+ virtual bool isAcceleratedCompositingActive() const;
+ virtual void willCloseLayerTreeView();
+ virtual void didAcquirePointerLock();
+ virtual void didNotAcquirePointerLock();
+ virtual void didLosePointerLock();
+ virtual void didChangeWindowResizerRect();
+ virtual void didExitCompositingMode();
+
+ // WebView methods:
+ virtual void initializeMainFrame(WebFrameClient*);
+ virtual void initializeHelperPluginFrame(WebFrameClient*);
+ virtual void setAutofillClient(WebAutofillClient*);
+ virtual void setDevToolsAgentClient(WebDevToolsAgentClient*);
+ virtual void setPermissionClient(WebPermissionClient*);
+ virtual void setPrerendererClient(WebPrerendererClient*) OVERRIDE;
+ virtual void setSpellCheckClient(WebSpellCheckClient*);
+ virtual void setValidationMessageClient(WebValidationMessageClient*) OVERRIDE;
+ virtual void setPasswordGeneratorClient(WebPasswordGeneratorClient*) OVERRIDE;
+ virtual WebSettings* settings();
+ virtual WebString pageEncoding() const;
+ virtual void setPageEncoding(const WebString& encoding);
+ virtual bool isTransparent() const;
+ virtual void setIsTransparent(bool value);
+ virtual void setBaseBackgroundColor(WebColor);
+ virtual bool tabsToLinks() const;
+ virtual void setTabsToLinks(bool value);
+ virtual bool tabKeyCyclesThroughElements() const;
+ virtual void setTabKeyCyclesThroughElements(bool value);
+ virtual bool isActive() const;
+ virtual void setIsActive(bool value);
+ virtual void setDomainRelaxationForbidden(bool, const WebString& scheme);
+ virtual void setWindowFeatures(const WebWindowFeatures&);
+ virtual bool dispatchBeforeUnloadEvent();
+ virtual void dispatchUnloadEvent();
+ virtual WebFrame* mainFrame();
+ virtual WebFrame* findFrameByName(
+ const WebString& name, WebFrame* relativeToFrame);
+ virtual WebFrame* focusedFrame();
+ virtual void setFocusedFrame(WebFrame* frame);
+ virtual void setInitialFocus(bool reverse);
+ virtual void clearFocusedNode();
+ virtual void scrollFocusedNodeIntoView();
+ virtual void scrollFocusedNodeIntoRect(const WebRect&);
+ virtual void zoomToFindInPageRect(const WebRect&);
+ virtual void advanceFocus(bool reverse);
+ virtual double zoomLevel();
+ virtual double setZoomLevel(bool textOnly, double zoomLevel);
+ virtual void zoomLimitsChanged(double minimumZoomLevel,
+ double maximumZoomLevel);
+ virtual void setInitialPageScaleOverride(float);
+ virtual bool zoomToMultipleTargetsRect(const WebRect&);
+ virtual float pageScaleFactor() const;
+ virtual void setPageScaleFactorPreservingScrollOffset(float);
+ virtual void setPageScaleFactor(float scaleFactor, const WebPoint& origin);
+ virtual void setPageScaleFactorLimits(float minPageScale, float maxPageScale);
+ virtual float minimumPageScaleFactor() const;
+ virtual float maximumPageScaleFactor() const;
+ virtual void saveScrollAndScaleState();
+ virtual void restoreScrollAndScaleState();
+ virtual void resetScrollAndScaleState();
+ virtual void setIgnoreViewportTagScaleLimits(bool);
+ virtual WebSize contentsPreferredMinimumSize();
+
+ virtual float deviceScaleFactor() const;
+ virtual void setDeviceScaleFactor(float);
+ virtual bool isFixedLayoutModeEnabled() const;
+ virtual void enableFixedLayoutMode(bool enable);
+ virtual WebSize fixedLayoutSize() const;
+ virtual void setFixedLayoutSize(const WebSize&);
+ virtual void enableAutoResizeMode(
+ const WebSize& minSize,
+ const WebSize& maxSize);
+ virtual void disableAutoResizeMode();
+ virtual void performMediaPlayerAction(
+ const WebMediaPlayerAction& action,
+ const WebPoint& location);
+ virtual void performPluginAction(
+ const WebPluginAction&,
+ const WebPoint&);
+ virtual WebHitTestResult hitTestResultAt(const WebPoint&);
+ virtual void copyImageAt(const WebPoint& point);
+ virtual void dragSourceEndedAt(
+ const WebPoint& clientPoint,
+ const WebPoint& screenPoint,
+ WebDragOperation operation);
+ virtual void dragSourceMovedTo(
+ const WebPoint& clientPoint,
+ const WebPoint& screenPoint,
+ WebDragOperation operation);
+ virtual void dragSourceSystemDragEnded();
+ virtual WebDragOperation dragTargetDragEnter(
+ const WebDragData&,
+ const WebPoint& clientPoint,
+ const WebPoint& screenPoint,
+ WebDragOperationsMask operationsAllowed,
+ int keyModifiers);
+ virtual WebDragOperation dragTargetDragOver(
+ const WebPoint& clientPoint,
+ const WebPoint& screenPoint,
+ WebDragOperationsMask operationsAllowed,
+ int keyModifiers);
+ virtual void dragTargetDragLeave();
+ virtual void dragTargetDrop(
+ const WebPoint& clientPoint,
+ const WebPoint& screenPoint,
+ int keyModifiers);
+ virtual void spellingMarkers(WebVector<uint32_t>* markers);
+ virtual unsigned long createUniqueIdentifierForRequest();
+ virtual void inspectElementAt(const WebPoint& point);
+ virtual WebString inspectorSettings() const;
+ virtual void setInspectorSettings(const WebString& settings);
+ virtual bool inspectorSetting(const WebString& key, WebString* value) const;
+ virtual void setInspectorSetting(const WebString& key,
+ const WebString& value);
+ virtual WebDevToolsAgent* devToolsAgent();
+ virtual WebAccessibilityObject accessibilityObject();
+ virtual void applyAutofillSuggestions(
+ const WebNode&,
+ const WebVector<WebString>& names,
+ const WebVector<WebString>& labels,
+ const WebVector<WebString>& icons,
+ const WebVector<int>& itemIDs,
+ int separatorIndex);
+ virtual void hidePopups();
+ virtual void selectAutofillSuggestionAtIndex(unsigned listIndex);
+ virtual void setScrollbarColors(unsigned inactiveColor,
+ unsigned activeColor,
+ unsigned trackColor);
+ virtual void setSelectionColors(unsigned activeBackgroundColor,
+ unsigned activeForegroundColor,
+ unsigned inactiveBackgroundColor,
+ unsigned inactiveForegroundColor);
+ virtual void performCustomContextMenuAction(unsigned action);
+ virtual void showContextMenu();
+ virtual void addPageOverlay(WebPageOverlay*, int /* zOrder */);
+ virtual void removePageOverlay(WebPageOverlay*);
+ virtual void transferActiveWheelFlingAnimation(const WebActiveWheelFlingParameters&);
+ virtual WebViewBenchmarkSupport* benchmarkSupport();
+ virtual void setShowPaintRects(bool);
+ virtual void setShowDebugBorders(bool);
+ virtual void setShowFPSCounter(bool);
+ virtual void setContinuousPaintingEnabled(bool);
+ virtual void setShowScrollBottleneckRects(bool);
+
+ // WebViewImpl
+
+ void suppressInvalidations(bool enable);
+ void invalidateRect(const WebCore::IntRect&);
+
+ void setIgnoreInputEvents(bool newValue);
+ WebDevToolsAgentPrivate* devToolsAgentPrivate() { return m_devToolsAgent.get(); }
+
+ WebCore::Color baseBackgroundColor() const { return m_baseBackgroundColor; }
+
+ PageOverlayList* pageOverlays() const { return m_pageOverlays.get(); }
+
+ void setOverlayLayer(WebCore::GraphicsLayer*);
+
+ const WebPoint& lastMouseDownPoint() const
+ {
+ return m_lastMouseDownPoint;
+ }
+
+ WebCore::Frame* focusedWebCoreFrame() const;
+
+ // Returns the currently focused Element or null if no element has focus.
+ WebCore::Element* focusedElement();
+
+ static WebViewImpl* fromPage(WebCore::Page*);
+
+ WebViewClient* client()
+ {
+ return m_client;
+ }
+
+ WebAutofillClient* autofillClient()
+ {
+ return m_autofillClient;
+ }
+
+ WebPermissionClient* permissionClient()
+ {
+ return m_permissionClient;
+ }
+
+ WebSpellCheckClient* spellCheckClient()
+ {
+ return m_spellCheckClient;
+ }
+
+ WebPasswordGeneratorClient* passwordGeneratorClient() const
+ {
+ return m_passwordGeneratorClient;
+ }
+
+ // Returns the page object associated with this view. This may be null when
+ // the page is shutting down, but will be valid at all other times.
+ WebCore::Page* page() const
+ {
+ return m_page.get();
+ }
+
+ WebCore::RenderTheme* theme() const;
+
+ // Returns the main frame associated with this view. This may be null when
+ // the page is shutting down, but will be valid at all other times.
+ WebFrameImpl* mainFrameImpl();
+
+ // History related methods:
+ void observeNewNavigation();
+
+ // Event related methods:
+ void mouseContextMenu(const WebMouseEvent&);
+ void mouseDoubleClick(const WebMouseEvent&);
+
+ bool detectContentOnTouch(const WebPoint&);
+ bool startPageScaleAnimation(const WebCore::IntPoint& targetPosition, bool useAnchor, float newScale, double durationInSeconds);
+
+ void numberOfWheelEventHandlersChanged(unsigned);
+ void hasTouchEventHandlers(bool);
+
+ // WebGestureCurveTarget implementation for fling.
+ virtual void scrollBy(const WebFloatSize&);
+
+ // Handles context menu events orignated via the the keyboard. These
+ // include the VK_APPS virtual key and the Shift+F10 combine. Code is
+ // based on the Webkit function bool WebView::handleContextMenuEvent(WPARAM
+ // wParam, LPARAM lParam) in webkit\webkit\win\WebView.cpp. The only
+ // significant change in this function is the code to convert from a
+ // Keyboard event to the Right Mouse button down event.
+ bool sendContextMenuEvent(const WebKeyboardEvent&);
+
+ // Notifies the WebView that a load has been committed. isNewNavigation
+ // will be true if a new session history item should be created for that
+ // load. isNavigationWithinPage will be true if the navigation does
+ // not take the user away from the current page.
+ void didCommitLoad(bool* isNewNavigation, bool isNavigationWithinPage);
+
+ // Indicates two things:
+ // 1) This view may have a new layout now.
+ // 2) Calling layout() is a no-op.
+ // After calling WebWidget::layout(), expect to get this notification
+ // unless the view did not need a layout.
+ void layoutUpdated(WebFrameImpl*);
+
+ void didChangeContentsSize();
+ void deviceOrPageScaleFactorChanged();
+
+ // Returns true if popup menus should be rendered by the browser, false if
+ // they should be rendered by WebKit (which is the default).
+ static bool useExternalPopupMenus();
+
+ bool contextMenuAllowed() const
+ {
+ return m_contextMenuAllowed;
+ }
+
+ bool shouldAutoResize() const
+ {
+ return m_shouldAutoResize;
+ }
+
+ WebCore::IntSize minAutoSize() const
+ {
+ return m_minAutoSize;
+ }
+
+ WebCore::IntSize maxAutoSize() const
+ {
+ return m_maxAutoSize;
+ }
+
+ // Sets the emulated text zoom factor
+ // (may not be 1 in the device metrics emulation mode).
+ void setEmulatedTextZoomFactor(float);
+
+ // Returns the emulated text zoom factor
+ // (which may not be 1 in the device metrics emulation mode).
+ float emulatedTextZoomFactor() const
+ {
+ return m_emulatedTextZoomFactor;
+ }
+
+ void updatePageDefinedPageScaleConstraints(const WebCore::ViewportArguments&);
+
+ // Start a system drag and drop operation.
+ void startDragging(
+ WebCore::Frame*,
+ const WebDragData& dragData,
+ WebDragOperationsMask mask,
+ const WebImage& dragImage,
+ const WebPoint& dragImageOffset);
+
+ void autofillPopupDidHide()
+ {
+ m_autofillPopupShowing = false;
+ }
+
+#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
+ // Returns the provider of desktop notifications.
+ NotificationPresenterImpl* notificationPresenterImpl();
+#endif
+
+ // Tries to scroll a frame or any parent of a frame. Returns true if the view
+ // was scrolled.
+ bool propagateScroll(WebCore::ScrollDirection, WebCore::ScrollGranularity);
+
+ // Notification that a popup was opened/closed.
+ void popupOpened(WebCore::PopupContainer* popupContainer);
+ void popupClosed(WebCore::PopupContainer* popupContainer);
+ // PagePopupDriver functions.
+ virtual WebCore::PagePopup* openPagePopup(WebCore::PagePopupClient*, const WebCore::IntRect& originBoundsInRootView) OVERRIDE;
+ virtual void closePagePopup(WebCore::PagePopup*) OVERRIDE;
+
+ void hideAutofillPopup();
+
+ // Creates a Helper Plugin of |pluginType| for |hostDocument|.
+ WebHelperPluginImpl* createHelperPlugin(const String& pluginType, const WebDocument& hostDocument);
+
+ // Returns the input event we're currently processing. This is used in some
+ // cases where the WebCore DOM event doesn't have the information we need.
+ static const WebInputEvent* currentInputEvent()
+ {
+ return m_currentInputEvent;
+ }
+
+ WebCore::GraphicsLayer* rootGraphicsLayer();
+ bool allowsAcceleratedCompositing();
+ void setRootGraphicsLayer(WebCore::GraphicsLayer*);
+ void scheduleCompositingLayerSync();
+ void scrollRootLayerRect(const WebCore::IntSize& scrollDelta, const WebCore::IntRect& clipRect);
+ WebCore::GraphicsLayerFactory* graphicsLayerFactory() const;
+ WebCore::RenderLayerCompositor* compositor() const;
+ void registerForAnimations(WebLayer*);
+ void scheduleAnimation();
+
+ void didProgrammaticallyScroll(const WebCore::IntPoint& scrollPoint);
+
+ virtual void setVisibilityState(WebPageVisibilityState, bool);
+
+ WebCore::PopupContainer* selectPopup() const { return m_selectPopup.get(); }
+ bool hasOpenedPopup() const { return m_selectPopup || m_pagePopup; }
+
+ // Returns true if the event leads to scrolling.
+ static bool mapKeyCodeForScroll(int keyCode,
+ WebCore::ScrollDirection* scrollDirection,
+ WebCore::ScrollGranularity* scrollGranularity);
+
+ // Called by a full frame plugin inside this view to inform it that its
+ // zoom level has been updated. The plugin should only call this function
+ // if the zoom change was triggered by the browser, it's only needed in case
+ // a plugin can update its own zoom, say because of its own UI.
+ void fullFramePluginZoomLevelChanged(double zoomLevel);
+
+ void computeScaleAndScrollForBlockRect(const WebRect& blockRect, float padding, float& scale, WebPoint& scroll, bool& doubleTapShouldZoomOut);
+ WebCore::Node* bestTapNode(const WebCore::PlatformGestureEvent& tapEvent);
+ void enableTapHighlight(const WebCore::PlatformGestureEvent& tapEvent);
+ void computeScaleAndScrollForFocusedNode(WebCore::Node* focusedNode, float& scale, WebCore::IntPoint& scroll, bool& needAnimation);
+
+ void animateDoubleTapZoom(const WebCore::IntPoint&);
+
+ void enableFakePageScaleAnimationForTesting(bool);
+ bool fakeDoubleTapAnimationPendingForTesting() const { return m_doubleTapZoomPending; }
+ WebCore::IntPoint fakePageScaleAnimationTargetPositionForTesting() const { return m_fakePageScaleAnimationTargetPosition; }
+ float fakePageScaleAnimationPageScaleForTesting() const { return m_fakePageScaleAnimationPageScaleFactor; }
+ bool fakePageScaleAnimationUseAnchorForTesting() const { return m_fakePageScaleAnimationUseAnchor; }
+
+ void enterFullScreenForElement(WebCore::Element*);
+ void exitFullScreenForElement(WebCore::Element*);
+
+ // Exposed for the purpose of overriding device metrics.
+ void sendResizeEventAndRepaint();
+
+ // Exposed for testing purposes.
+ bool hasHorizontalScrollbar();
+ bool hasVerticalScrollbar();
+
+ // Pointer Lock calls allow a page to capture all mouse events and
+ // disable the system cursor.
+ virtual bool requestPointerLock();
+ virtual void requestPointerUnlock();
+ virtual bool isPointerLocked();
+
+ // Heuristic-based function for determining if we should disable workarounds
+ // for viewing websites that are not optimized for mobile devices.
+ bool shouldDisableDesktopWorkarounds();
+
+ // Exposed for tests.
+ LinkHighlight* linkHighlight() { return m_linkHighlight.get(); }
+
+ WebSettingsImpl* settingsImpl();
+
+ // Returns the bounding box of the block type node touched by the WebRect.
+ WebRect computeBlockBounds(const WebRect&, bool ignoreClipping);
+
+ WebCore::IntPoint clampOffsetAtScale(const WebCore::IntPoint& offset, float scale);
+
+private:
+ void refreshPageScaleFactorAfterLayout();
+ void setUserAgentPageScaleConstraints(WebCore::PageScaleConstraints newConstraints);
+ float clampPageScaleFactorToLimits(float) const;
+ WebCore::IntSize contentsSize() const;
+
+ void resetSavedScrollAndScaleState();
+
+ void updateMainFrameScrollPosition(const WebCore::IntPoint& scrollPosition, bool programmaticScroll);
+
+ friend class WebView; // So WebView::Create can call our constructor
+ friend class WTF::RefCounted<WebViewImpl>;
+ friend void setCurrentInputEventForTest(const WebInputEvent*);
+
+ enum DragAction {
+ DragEnter,
+ DragOver
+ };
+
+ WebViewImpl(WebViewClient*);
+ virtual ~WebViewImpl();
+
+ WebTextInputType textInputType();
+
+ WebString inputModeOfFocusedElement();
+
+ // Returns true if the event was actually processed.
+ bool keyEventDefault(const WebKeyboardEvent&);
+
+ // Returns true if the autocomple has consumed the event.
+ bool autocompleteHandleKeyEvent(const WebKeyboardEvent&);
+
+ // Repaints the Autofill popup. Should be called when the suggestions
+ // have changed. Note that this should only be called when the Autofill
+ // popup is showing.
+ void refreshAutofillPopup();
+
+ bool confirmComposition(const WebString& text, ConfirmCompositionBehavior);
+
+ // Returns true if the view was scrolled.
+ bool scrollViewWithKeyboard(int keyCode, int modifiers);
+
+ void hideSelectPopup();
+
+ // Converts |pos| from window coordinates to contents coordinates and gets
+ // the HitTestResult for it.
+ WebCore::HitTestResult hitTestResultForWindowPos(const WebCore::IntPoint&);
+
+ // Consolidate some common code between starting a drag over a target and
+ // updating a drag over a target. If we're starting a drag, |isEntering|
+ // should be true.
+ WebDragOperation dragTargetDragEnterOrOver(const WebPoint& clientPoint,
+ const WebPoint& screenPoint,
+ DragAction,
+ int keyModifiers);
+
+ void configureAutoResizeMode();
+
+ void setIsAcceleratedCompositingActive(bool);
+ void doComposite();
+ void doPixelReadbackToCanvas(WebCanvas*, const WebCore::IntRect&);
+ void reallocateRenderer();
+ void updateLayerTreeViewport();
+
+ // Helper function: Widens the width of |source| by the specified margins
+ // while keeping it smaller than page width.
+ WebRect widenRectWithinPageBounds(const WebRect& source, int targetMargin, int minimumMargin);
+
+ void pointerLockMouseEvent(const WebInputEvent&);
+
+ // PageWidgetEventHandler functions
+ virtual void handleMouseDown(WebCore::Frame&, const WebMouseEvent&) OVERRIDE;
+ virtual void handleMouseUp(WebCore::Frame&, const WebMouseEvent&) OVERRIDE;
+ virtual bool handleMouseWheel(WebCore::Frame&, const WebMouseWheelEvent&) OVERRIDE;
+ virtual bool handleGestureEvent(const WebGestureEvent&) OVERRIDE;
+ virtual bool handleKeyEvent(const WebKeyboardEvent&) OVERRIDE;
+ virtual bool handleCharEvent(const WebKeyboardEvent&) OVERRIDE;
+
+ WebViewClient* m_client; // Can be 0 (e.g. unittests, shared workers, etc.)
+ WebAutofillClient* m_autofillClient;
+ WebPermissionClient* m_permissionClient;
+ WebSpellCheckClient* m_spellCheckClient;
+ WebPasswordGeneratorClient* m_passwordGeneratorClient;
+
+ ChromeClientImpl m_chromeClientImpl;
+ ContextMenuClientImpl m_contextMenuClientImpl;
+ DragClientImpl m_dragClientImpl;
+ EditorClientImpl m_editorClientImpl;
+ InspectorClientImpl m_inspectorClientImpl;
+ BackForwardClientImpl m_backForwardClientImpl;
+
+ WebSize m_size;
+ // If true, automatically resize the render view around its content.
+ bool m_shouldAutoResize;
+ // The lower bound on the size when auto-resizing.
+ WebCore::IntSize m_minAutoSize;
+ // The upper bound on the size when auto-resizing.
+ WebCore::IntSize m_maxAutoSize;
+
+ OwnPtr<WebCore::Page> m_page;
+
+ // This flag is set when a new navigation is detected. It is used to satisfy
+ // the corresponding argument to WebFrameClient::didCommitProvisionalLoad.
+ bool m_observedNewNavigation;
+#ifndef NDEBUG
+ // Used to assert that the new navigation we observed is the same navigation
+ // when we make use of m_observedNewNavigation.
+ const WebCore::DocumentLoader* m_newNavigationLoader;
+#endif
+
+ // An object that can be used to manipulate m_page->settings() without linking
+ // against WebCore. This is lazily allocated the first time GetWebSettings()
+ // is called.
+ OwnPtr<WebSettingsImpl> m_webSettings;
+
+ // A copy of the web drop data object we received from the browser.
+ RefPtr<WebCore::ChromiumDataObject> m_currentDragData;
+
+ // The point relative to the client area where the mouse was last pressed
+ // down. This is used by the drag client to determine what was under the
+ // mouse when the drag was initiated. We need to track this here in
+ // WebViewImpl since DragClient::startDrag does not pass the position the
+ // mouse was at when the drag was initiated, only the current point, which
+ // can be misleading as it is usually not over the element the user actually
+ // dragged by the time a drag is initiated.
+ WebPoint m_lastMouseDownPoint;
+
+ // Keeps track of the current zoom level. 0 means no zoom, positive numbers
+ // mean zoom in, negative numbers mean zoom out.
+ double m_zoomLevel;
+
+ double m_minimumZoomLevel;
+
+ double m_maximumZoomLevel;
+
+ WebCore::PageScaleConstraintsSet m_pageScaleConstraintsSet;
+
+ // Saved page scale state.
+ float m_savedPageScaleFactor; // 0 means that no page scale factor is saved.
+ WebCore::IntSize m_savedScrollOffset;
+
+ // The scale moved to by the latest double tap zoom, if any.
+ float m_doubleTapZoomPageScaleFactor;
+ // Have we sent a double-tap zoom and not yet heard back the scale?
+ bool m_doubleTapZoomPending;
+
+ // Used for testing purposes.
+ bool m_enableFakePageScaleAnimationForTesting;
+ WebCore::IntPoint m_fakePageScaleAnimationTargetPosition;
+ float m_fakePageScaleAnimationPageScaleFactor;
+ bool m_fakePageScaleAnimationUseAnchor;
+
+ bool m_contextMenuAllowed;
+
+ bool m_doingDragAndDrop;
+
+ bool m_ignoreInputEvents;
+
+ // Webkit expects keyPress events to be suppressed if the associated keyDown
+ // event was handled. Safari implements this behavior by peeking out the
+ // associated WM_CHAR event if the keydown was handled. We emulate
+ // this behavior by setting this flag if the keyDown was handled.
+ bool m_suppressNextKeypressEvent;
+
+ // Represents whether or not this object should process incoming IME events.
+ bool m_imeAcceptEvents;
+
+ // The available drag operations (copy, move link...) allowed by the source.
+ WebDragOperation m_operationsAllowed;
+
+ // The current drag operation as negotiated by the source and destination.
+ // When not equal to DragOperationNone, the drag data can be dropped onto the
+ // current drop target in this WebView (the drop target can accept the drop).
+ WebDragOperation m_dragOperation;
+
+ // Context-based feature switches.
+ OwnPtr<ContextFeaturesClientImpl> m_featureSwitchClient;
+
+ // Whether an Autofill popup is currently showing.
+ bool m_autofillPopupShowing;
+
+ // The Autofill popup client.
+ OwnPtr<AutofillPopupMenuClient> m_autofillPopupClient;
+
+ // The Autofill popup.
+ RefPtr<WebCore::PopupContainer> m_autofillPopup;
+
+ // The popup associated with a select element.
+ RefPtr<WebCore::PopupContainer> m_selectPopup;
+
+ // The popup associated with an input element.
+ RefPtr<WebPagePopupImpl> m_pagePopup;
+
+ OwnPtr<WebDevToolsAgentPrivate> m_devToolsAgent;
+ OwnPtr<PageOverlayList> m_pageOverlays;
+
+ // Whether the webview is rendering transparently.
+ bool m_isTransparent;
+
+ // Whether the user can press tab to focus links.
+ bool m_tabsToLinks;
+
+ // Inspector settings.
+ WebString m_inspectorSettings;
+
+ typedef HashMap<WTF::String, WTF::String> SettingsMap;
+ OwnPtr<SettingsMap> m_inspectorSettingsMap;
+
+#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
+ // The provider of desktop notifications;
+ NotificationPresenterImpl m_notificationPresenter;
+#endif
+
+ // If set, the (plugin) node which has mouse capture.
+ RefPtr<WebCore::Node> m_mouseCaptureNode;
+
+ WebViewBenchmarkSupportImpl m_benchmarkSupport;
+
+ WebCore::IntRect m_rootLayerScrollDamage;
+ WebLayerTreeView* m_layerTreeView;
+ WebLayer* m_rootLayer;
+ WebCore::GraphicsLayer* m_rootGraphicsLayer;
+ OwnPtr<WebCore::GraphicsLayerFactory> m_graphicsLayerFactory;
+ bool m_isAcceleratedCompositingActive;
+ bool m_layerTreeViewCommitsDeferred;
+ bool m_compositorCreationFailed;
+ // If true, the graphics context is being restored.
+ bool m_recreatingGraphicsContext;
+ static const WebInputEvent* m_currentInputEvent;
+ OwnPtr<PinchViewports> m_pinchViewports;
+
+#if ENABLE(INPUT_SPEECH)
+ OwnPtr<SpeechInputClientImpl> m_speechInputClient;
+#endif
+ OwnPtr<SpeechRecognitionClientProxy> m_speechRecognitionClient;
+
+ OwnPtr<DeviceOrientationClientProxy> m_deviceOrientationClientProxy;
+ OwnPtr<GeolocationClientProxy> m_geolocationClientProxy;
+
+ float m_emulatedTextZoomFactor;
+
+ UserMediaClientImpl m_userMediaClientImpl;
+ MIDIClientImpl m_midiClientImpl;
+#if ENABLE(NAVIGATOR_CONTENT_UTILS)
+ OwnPtr<NavigatorContentUtilsClientImpl> m_navigatorContentUtilsClient;
+#endif
+ OwnPtr<WebActiveGestureAnimation> m_gestureAnimation;
+ WebPoint m_positionOnFlingStart;
+ WebPoint m_globalPositionOnFlingStart;
+ int m_flingModifier;
+ bool m_flingSourceDevice;
+ OwnPtr<LinkHighlight> m_linkHighlight;
+ OwnPtr<ValidationMessageClientImpl> m_validationMessage;
+ OwnPtr<FullscreenController> m_fullscreenController;
+
+ bool m_showFPSCounter;
+ bool m_showPaintRects;
+ bool m_showDebugBorders;
+ bool m_continuousPaintingEnabled;
+ bool m_showScrollBottleneckRects;
+ WebColor m_baseBackgroundColor;
+};
+
+} // namespace WebKit
+
+#endif