WebKit/chromium/src/WebViewImpl.h
changeset 0 4f2f89ce4247
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebKit/chromium/src/WebViewImpl.h	Fri Sep 17 09:02:29 2010 +0300
@@ -0,0 +1,519 @@
+/*
+ * 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 "WebGLES2Context.h"
+#include "WebNavigationPolicy.h"
+#include "WebPoint.h"
+#include "WebSize.h"
+#include "WebString.h"
+#include "WebView.h"
+
+#include "BackForwardListClientImpl.h"
+#include "ChromeClientImpl.h"
+#include "ContextMenuClientImpl.h"
+#include "DragClientImpl.h"
+#include "EditorClientImpl.h"
+#include "GraphicsLayer.h"
+#include "InspectorClientImpl.h"
+#include "LayerRendererChromium.h"
+#include "NotificationPresenterImpl.h"
+#include <wtf/OwnPtr.h>
+#include <wtf/RefCounted.h>
+
+namespace WebCore {
+class ChromiumDataObject;
+class Frame;
+class GLES2Context;
+class HistoryItem;
+class HitTestResult;
+class KeyboardEvent;
+class Page;
+class PlatformKeyboardEvent;
+class PopupContainer;
+class PopupMenuClient;
+class Range;
+class RenderTheme;
+class Widget;
+}
+
+namespace WebKit {
+class AutocompletePopupMenuClient;
+class AutoFillPopupMenuClient;
+class ContextMenuClientImpl;
+class DragScrollTimer;
+class WebAccessibilityObject;
+class WebDevToolsAgentClient;
+class WebDevToolsAgentPrivate;
+class WebFrameImpl;
+class WebImage;
+class WebKeyboardEvent;
+class WebMouseEvent;
+class WebMouseWheelEvent;
+class WebSettingsImpl;
+class WebTouchEvent;
+
+class WebViewImpl : public WebView, public RefCounted<WebViewImpl> {
+public:
+    // WebWidget methods:
+    virtual void close();
+    virtual WebSize size() { return m_size; }
+    virtual void resize(const WebSize&);
+    virtual void layout();
+    virtual void paint(WebCanvas*, const WebRect&);
+    virtual bool handleInputEvent(const WebInputEvent&);
+    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 WebTextInputType textInputType();
+    virtual WebRect caretOrSelectionBounds();
+    virtual void setTextDirection(WebTextDirection direction);
+    virtual bool isAcceleratedCompositingActive() const;
+
+    // WebView methods:
+    virtual void initializeMainFrame(WebFrameClient*);
+    virtual WebSettings* settings();
+    virtual WebString pageEncoding() const;
+    virtual void setPageEncoding(const WebString& encoding);
+    virtual bool isTransparent() const;
+    virtual void setIsTransparent(bool value);
+    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 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 int zoomLevel();
+    virtual int setZoomLevel(bool textOnly, int zoomLevel);
+    virtual void performMediaPlayerAction(
+        const WebMediaPlayerAction& action,
+        const WebPoint& location);
+    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& dragData, int identity,
+        const WebPoint& clientPoint,
+        const WebPoint& screenPoint,
+        WebDragOperationsMask operationsAllowed);
+    virtual WebDragOperation dragTargetDragOver(
+        const WebPoint& clientPoint,
+        const WebPoint& screenPoint,
+        WebDragOperationsMask operationsAllowed);
+    virtual void dragTargetDragLeave();
+    virtual void dragTargetDrop(
+        const WebPoint& clientPoint,
+        const WebPoint& screenPoint);
+    virtual int dragIdentity();
+    virtual bool setDropEffect(bool accept);
+    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();
+    // DEPRECATED.
+    virtual void applyAutoFillSuggestions(
+        const WebNode&,
+        const WebVector<WebString>& names,
+        const WebVector<WebString>& labels,
+        int separatorIndex);
+    virtual void applyAutoFillSuggestions(
+        const WebNode&,
+        const WebVector<WebString>& names,
+        const WebVector<WebString>& labels,
+        const WebVector<int>& uniqueIDs,
+        int separatorIndex);
+    // DEPRECATED: replacing with applyAutoFillSuggestions.
+    virtual void applyAutocompleteSuggestions(
+        const WebNode&,
+        const WebVector<WebString>& suggestions,
+        int defaultSuggestionIndex);
+    virtual void hidePopups();
+    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);
+
+    // WebViewImpl
+
+    void setIgnoreInputEvents(bool newValue);
+    WebDevToolsAgentPrivate* devToolsAgentPrivate() { return m_devToolsAgent.get(); }
+
+    const WebPoint& lastMouseDownPoint() const
+    {
+        return m_lastMouseDownPoint;
+    }
+
+    WebCore::Frame* focusedWebCoreFrame();
+
+    // Returns the currently focused Node or null if no node has focus.
+    WebCore::Node* focusedWebCoreNode();
+
+    static WebViewImpl* fromPage(WebCore::Page*);
+
+    WebViewClient* client()
+    {
+        return m_client;
+    }
+
+    // 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 setCurrentHistoryItem(WebCore::HistoryItem*);
+    WebCore::HistoryItem* previousHistoryItem();
+    void observeNewNavigation();
+
+    // Event related methods:
+    void mouseMove(const WebMouseEvent&);
+    void mouseLeave(const WebMouseEvent&);
+    void mouseDown(const WebMouseEvent&);
+    void mouseUp(const WebMouseEvent&);
+    void mouseContextMenu(const WebMouseEvent&);
+    void mouseDoubleClick(const WebMouseEvent&);
+    void mouseWheel(const WebMouseWheelEvent&);
+    bool keyEvent(const WebKeyboardEvent&);
+    bool charEvent(const WebKeyboardEvent&);
+    bool touchEvent(const WebTouchEvent&);
+
+    // 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.
+    void didCommitLoad(bool* isNewNavigation);
+
+    bool contextMenuAllowed() const
+    {
+        return m_contextMenuAllowed;
+    }
+
+    // Set the disposition for how this webview is to be initially shown.
+    void setInitialNavigationPolicy(WebNavigationPolicy policy)
+    {
+        m_initialNavigationPolicy = policy;
+    }
+    WebNavigationPolicy initialNavigationPolicy() const
+    {
+        return m_initialNavigationPolicy;
+    }
+
+    // Determines whether a page should e.g. be opened in a background tab.
+    // Returns false if it has no opinion, in which case it doesn't set *policy.
+    static bool navigationPolicyFromMouseEvent(
+        unsigned short button,
+        bool ctrl,
+        bool shift,
+        bool alt,
+        bool meta,
+        WebNavigationPolicy*);
+
+    // Start a system drag and drop operation.
+    void startDragging(
+        const WebDragData& dragData,
+        WebDragOperationsMask mask,
+        const WebImage& dragImage,
+        const WebPoint& dragImageOffset);
+
+    void autoFillPopupDidHide()
+    {
+        m_autoFillPopupShowing = false;
+    }
+
+#if ENABLE(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);
+
+    void hideAutoFillPopup();
+
+    // HACK: currentInputEvent() is for ChromeClientImpl::show(), until we can
+    // fix WebKit to pass enough information up into ChromeClient::show() so we
+    // can decide if the window.open event was caused by a middle-mouse click
+    static const WebInputEvent* currentInputEvent()
+    {
+        return m_currentInputEvent;
+    }
+
+#if USE(ACCELERATED_COMPOSITING)
+    void setRootLayerNeedsDisplay();
+    void setRootGraphicsLayer(WebCore::PlatformLayer*);
+#endif
+    // Onscreen contexts display to the screen associated with this view.
+    // Offscreen contexts render offscreen but can share resources with the
+    // onscreen context and thus can be composited.
+    PassOwnPtr<WebCore::GLES2Context> getOnscreenGLES2Context();
+    PassOwnPtr<WebCore::GLES2Context> getOffscreenGLES2Context();
+
+    // Returns an onscreen context
+    virtual WebGLES2Context* gles2Context();
+
+    WebCore::PopupContainer* selectPopup() const { return m_selectPopup.get(); }
+
+    // Returns true if the event leads to scrolling.
+    static bool mapKeyCodeForScroll(int keyCode,
+                                   WebCore::ScrollDirection* scrollDirection,
+                                   WebCore::ScrollGranularity* scrollGranularity);
+
+private:
+    friend class WebView;  // So WebView::Create can call our constructor
+    friend class WTF::RefCounted<WebViewImpl>;
+
+    enum DragAction {
+      DragEnter,
+      DragOver
+    };
+
+    WebViewImpl(WebViewClient* client, WebDevToolsAgentClient* devToolsClient);
+    ~WebViewImpl();
+
+    // Returns true if the event was actually processed.
+    bool keyEventDefault(const WebKeyboardEvent&);
+
+    // Returns true if the select popup has consumed the event.
+    bool selectPopupHandleKeyEvent(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();
+
+    // 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);
+
+#if USE(ACCELERATED_COMPOSITING)
+    void setIsAcceleratedCompositingActive(bool);
+    void updateRootLayerContents(const WebRect&);
+#endif
+
+    WebViewClient* m_client;
+
+    BackForwardListClientImpl m_backForwardListClientImpl;
+    ChromeClientImpl m_chromeClientImpl;
+    ContextMenuClientImpl m_contextMenuClientImpl;
+    DragClientImpl m_dragClientImpl;
+    EditorClientImpl m_editorClientImpl;
+    InspectorClientImpl m_inspectorClientImpl;
+
+    WebSize m_size;
+
+    WebPoint m_lastMousePosition;
+    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.
+    int m_zoomLevel;
+
+    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;
+
+    // The policy for how this webview is to be initially shown.
+    WebNavigationPolicy m_initialNavigationPolicy;
+
+    // Represents whether or not this object should process incoming IME events.
+    bool m_imeAcceptEvents;
+
+    // True while dispatching system drag and drop events to drag/drop targets
+    // within this WebView.
+    bool m_dragTargetDispatch;
+
+    // Valid when m_dragTargetDispatch is true; the identity of the drag data
+    // copied from the WebDropData object sent from the browser process.
+    int m_dragIdentity;
+
+    // Valid when m_dragTargetDispatch is true. Used to override the default
+    // browser drop effect with the effects "none" or "copy".
+    enum DragTargetDropEffect {
+        DropEffectDefault = -1,
+        DropEffectNone,
+        DropEffectCopy
+    } m_dropEffect;
+
+    // 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;
+
+    // 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;
+
+    OwnPtr<WebDevToolsAgentPrivate> m_devToolsAgent;
+
+    // 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<WebCore::String, WebCore::String> SettingsMap;
+    OwnPtr<SettingsMap> m_inspectorSettingsMap;
+    OwnPtr<DragScrollTimer> m_dragScrollTimer;
+
+#if ENABLE(NOTIFICATIONS)
+    // The provider of desktop notifications;
+    NotificationPresenterImpl m_notificationPresenter;
+#endif
+
+    // If set, the (plugin) node which has mouse capture.
+    RefPtr<WebCore::Node> m_mouseCaptureNode;
+
+#if USE(ACCELERATED_COMPOSITING)
+    OwnPtr<WebCore::LayerRendererChromium> m_layerRenderer;
+    bool m_isAcceleratedCompositingActive;
+#endif
+    static const WebInputEvent* m_currentInputEvent;
+
+    OwnPtr<WebGLES2Context> m_gles2Context;
+};
+
+} // namespace WebKit
+
+#endif