#ifndef WebViewImpl_h
#define WebViewImpl_h
#include "WebNavigationPolicy.h"
#include "platform/WebLayer.h"
#include "platform/WebLayerTreeView.h"
#include "platform/WebLayerTreeViewClient.h"
#include "platform/WebPoint.h"
#include "platform/WebRect.h"
#include "platform/WebSize.h"
#include "platform/WebString.h"
#include "WebView.h"
#include "ChromeClientImpl.h"
#include "ContextMenuClientImpl.h"
#include "DragClientImpl.h"
#include "EditorClientImpl.h"
#include "GraphicsContext3D.h"
#include "GraphicsLayer.h"
#include "InspectorClientImpl.h"
#include "IntPoint.h"
#include "IntRect.h"
#include "NotificationPresenterImpl.h"
#include "PageOverlayList.h"
#include "PageWidgetDelegate.h"
#include "PlatformGestureCurveTarget.h"
#include "UserMediaClientImpl.h"
#include <wtf/OwnPtr.h>
#include <wtf/RefCounted.h>
namespace WebCore {
class ActivePlatformGestureAnimation;
class ChromiumDataObject;
class Color;
class DocumentLoader;
class Frame;
class GraphicsContext3D;
class HistoryItem;
class HitTestResult;
class KeyboardEvent;
class Page;
class PagePopup;
class PagePopupClient;
class PlatformGestureCurveTarget;
class PlatformKeyboardEvent;
class PopupContainer;
class PopupMenuClient;
class Range;
class RenderTheme;
class TextFieldDecorator;
class Widget;
}
namespace WebKit {
class AutocompletePopupMenuClient;
class AutofillPopupMenuClient;
class BatteryClientImpl;
class ContextMenuClientImpl;
class DeviceOrientationClientProxy;
class DragScrollTimer;
class GeolocationClientProxy;
class NonCompositedContentHost;
class SpeechInputClientImpl;
class SpeechRecognitionClientProxy;
class UserMediaClientImpl;
class WebAccessibilityObject;
class WebCompositorImpl;
class WebDevToolsAgentClient;
class WebDevToolsAgentPrivate;
class WebFrameImpl;
class WebGestureEvent;
class WebPagePopupImpl;
class WebImage;
class WebKeyboardEvent;
class WebMouseEvent;
class WebMouseWheelEvent;
class WebSettingsImpl;
class WebTouchEvent;
class WebViewImpl : public WebView, public WebLayerTreeViewClient, public RefCounted<WebViewImpl>, public WebCore::PlatformGestureCurveTarget, public PageWidgetEventHandler {
public:
enum AutoZoomType {
DoubleTap,
FindInPage,
};
virtual void close();
virtual WebSize size() { return m_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 setCompositorSurfaceReady();
virtual void animate(double);
virtual void layout(); virtual void paint(WebCanvas*, const WebRect&);
virtual void themeChanged();
virtual void composite(bool finish);
virtual void setNeedsRedraw();
virtual bool isInputThrottled() const;
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 bool confirmComposition(const WebString& text);
virtual bool compositionRange(size_t* location, size_t* length);
virtual WebTextInputType textInputType();
virtual bool selectionBounds(WebRect& start, WebRect& end) const;
virtual bool caretOrSelectionRange(size_t* location, size_t* length);
virtual void setTextDirection(WebTextDirection direction);
virtual bool isAcceleratedCompositingActive() const;
virtual void didAcquirePointerLock();
virtual void didNotAcquirePointerLock();
virtual void didLosePointerLock();
virtual void didChangeWindowResizerRect();
virtual void instrumentBeginFrame();
virtual void instrumentCancelFrame();
virtual void initializeMainFrame(WebFrameClient*);
virtual void setAutofillClient(WebAutofillClient*);
virtual void setDevToolsAgentClient(WebDevToolsAgentClient*);
virtual void setPermissionClient(WebPermissionClient*);
virtual void setSpellCheckClient(WebSpellCheckClient*);
virtual void addTextFieldDecoratorClient(WebTextFieldDecoratorClient*) OVERRIDE;
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 void setDomainRelaxationForbidden(bool, const WebString& scheme);
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 double zoomLevel();
virtual double setZoomLevel(bool textOnly, double zoomLevel);
virtual void zoomLimitsChanged(double minimumZoomLevel,
double maximumZoomLevel);
virtual float pageScaleFactor() const;
virtual bool isPageScaleFactorSet() 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 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 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);
virtual WebDragOperation dragTargetDragOver(
const WebPoint& clientPoint,
const WebPoint& screenPoint,
WebDragOperationsMask operationsAllowed);
virtual void dragTargetDragLeave();
virtual void dragTargetDrop(
const WebPoint& clientPoint,
const WebPoint& screenPoint);
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 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 addPageOverlay(WebPageOverlay*, int );
virtual void removePageOverlay(WebPageOverlay*);
#if ENABLE(BATTERY_STATUS)
virtual void updateBatteryStatus(const WebBatteryStatus&);
#endif
virtual void transferActiveWheelFlingAnimation(const WebActiveWheelFlingParameters&);
virtual void willBeginFrame();
virtual void updateAnimations(double monotonicFrameBeginTime);
virtual void applyScrollAndScale(const WebSize&, float);
virtual WebGraphicsContext3D* createContext3D();
virtual void didRebindGraphicsContext(bool);
virtual void didCommit();
virtual void didCommitAndDrawFrame();
virtual void didCompleteSwapBuffers();
virtual void scheduleComposite();
void setIgnoreInputEvents(bool newValue);
WebDevToolsAgentPrivate* devToolsAgentPrivate() { return m_devToolsAgent.get(); }
PageOverlayList* pageOverlays() const { return m_pageOverlays.get(); }
void setOverlayLayer(WebCore::GraphicsLayer*);
const WebPoint& lastMouseDownPoint() const
{
return m_lastMouseDownPoint;
}
WebCore::Frame* focusedWebCoreFrame() const;
WebCore::Node* focusedWebCoreNode();
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;
}
const Vector<OwnPtr<WebCore::TextFieldDecorator> >& textFieldDecorators() const { return m_textFieldDecorators; }
WebCore::Page* page() const
{
return m_page.get();
}
WebCore::RenderTheme* theme() const;
WebFrameImpl* mainFrameImpl();
void observeNewNavigation();
void mouseContextMenu(const WebMouseEvent&);
void mouseDoubleClick(const WebMouseEvent&);
void startPageScaleAnimation(const WebCore::IntPoint& targetPosition, bool useAnchor, float newScale, double durationSec);
void numberOfWheelEventHandlersChanged(unsigned);
void numberOfTouchEventHandlersChanged(unsigned);
virtual void scrollBy(const WebCore::IntPoint&);
bool sendContextMenuEvent(const WebKeyboardEvent&);
void didCommitLoad(bool* isNewNavigation, bool isNavigationWithinPage);
void layoutUpdated(WebFrameImpl*);
void didChangeContentsSize();
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;
}
void setInitialNavigationPolicy(WebNavigationPolicy policy)
{
m_initialNavigationPolicy = policy;
}
WebNavigationPolicy initialNavigationPolicy() const
{
return m_initialNavigationPolicy;
}
void setEmulatedTextZoomFactor(float);
float emulatedTextZoomFactor() const
{
return m_emulatedTextZoomFactor;
}
static bool navigationPolicyFromMouseEvent(
unsigned short button,
bool ctrl,
bool shift,
bool alt,
bool meta,
WebNavigationPolicy*);
void startDragging(
const WebDragData& dragData,
WebDragOperationsMask mask,
const WebImage& dragImage,
const WebPoint& dragImageOffset);
void autofillPopupDidHide()
{
m_autofillPopupShowing = false;
}
#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
NotificationPresenterImpl* notificationPresenterImpl();
#endif
bool propagateScroll(WebCore::ScrollDirection, WebCore::ScrollGranularity);
void popupOpened(WebCore::PopupContainer* popupContainer);
void popupClosed(WebCore::PopupContainer* popupContainer);
#if ENABLE(PAGE_POPUP)
WebCore::PagePopup* openPagePopup(WebCore::PagePopupClient*, const WebCore::IntRect& originBoundsInRootView);
void closePagePopup(WebCore::PagePopup*);
#endif
void hideAutofillPopup();
static const WebInputEvent* currentInputEvent()
{
return m_currentInputEvent;
}
#if USE(ACCELERATED_COMPOSITING)
bool allowsAcceleratedCompositing();
bool pageHasRTLStyle() const;
void setRootGraphicsLayer(WebCore::GraphicsLayer*);
void scheduleCompositingLayerSync();
void scrollRootLayerRect(const WebCore::IntSize& scrollDelta, const WebCore::IntRect& clipRect);
void invalidateRootLayerRect(const WebCore::IntRect&);
NonCompositedContentHost* nonCompositedContentHost();
void setBackgroundColor(const WebCore::Color&);
#endif
#if ENABLE(REQUEST_ANIMATION_FRAME)
void scheduleAnimation();
#endif
virtual WebGraphicsContext3D* graphicsContext3D();
virtual WebGraphicsContext3D* sharedGraphicsContext3D();
PassOwnPtr<WebGraphicsContext3D> createCompositorGraphicsContext3D();
virtual void setVisibilityState(WebPageVisibilityState, bool);
WebCore::PopupContainer* selectPopup() const { return m_selectPopup.get(); }
#if ENABLE(PAGE_POPUP)
bool hasOpenedPopup() const { return m_selectPopup || m_pagePopup; }
#else
bool hasOpenedPopup() const { return m_selectPopup; }
#endif
static bool mapKeyCodeForScroll(int keyCode,
WebCore::ScrollDirection* scrollDirection,
WebCore::ScrollGranularity* scrollGranularity);
void fullFramePluginZoomLevelChanged(double zoomLevel);
#if ENABLE(GESTURE_EVENTS)
void computeScaleAndScrollForHitRect(const WebRect& hitRect, AutoZoomType, float& scale, WebPoint& scroll);
#endif
void loseCompositorContext(int numTimes);
void enterFullScreenForElement(WebCore::Element*);
void exitFullScreenForElement(WebCore::Element*);
void sendResizeEventAndRepaint();
bool hasHorizontalScrollbar();
bool hasVerticalScrollbar();
#if ENABLE(POINTER_LOCK)
virtual bool requestPointerLock();
virtual void requestPointerUnlock();
virtual bool isPointerLocked();
#endif
private:
bool computePageScaleFactorLimits();
float clampPageScaleFactorToLimits(float scale);
WebPoint clampOffsetAtScale(const WebPoint& offset, float scale);
friend class WebView; friend class WTF::RefCounted<WebViewImpl>;
enum DragAction {
DragEnter,
DragOver
};
WebViewImpl(WebViewClient*);
virtual ~WebViewImpl();
bool keyEventDefault(const WebKeyboardEvent&);
bool autocompleteHandleKeyEvent(const WebKeyboardEvent&);
void refreshAutofillPopup();
bool scrollViewWithKeyboard(int keyCode, int modifiers);
void hideSelectPopup();
WebCore::HitTestResult hitTestResultForWindowPos(const WebCore::IntPoint&);
WebDragOperation dragTargetDragEnterOrOver(const WebPoint& clientPoint,
const WebPoint& screenPoint,
DragAction);
void configureAutoResizeMode();
#if USE(ACCELERATED_COMPOSITING)
void setIsAcceleratedCompositingActive(bool);
void doComposite();
void doPixelReadbackToCanvas(WebCanvas*, const WebCore::IntRect&);
void reallocateRenderer();
void updateLayerTreeViewport();
#endif
#if ENABLE(GESTURE_EVENTS)
WebRect computeBlockBounds(const WebRect&, AutoZoomType);
WebRect widenRectWithinPageBounds(const WebRect& source, int targetMargin, int minimumMargin);
#endif
#if ENABLE(POINTER_LOCK)
void pointerLockMouseEvent(const WebInputEvent&);
#endif
virtual void handleMouseLeave(WebCore::Frame&, const WebMouseEvent&) OVERRIDE;
virtual void handleMouseDown(WebCore::Frame&, const WebMouseEvent&) OVERRIDE;
virtual void handleMouseUp(WebCore::Frame&, const WebMouseEvent&) OVERRIDE;
virtual bool handleGestureEvent(const WebGestureEvent&) OVERRIDE;
virtual bool handleKeyEvent(const WebKeyboardEvent&) OVERRIDE;
virtual bool handleCharEvent(const WebKeyboardEvent&) OVERRIDE;
WebViewClient* m_client;
WebAutofillClient* m_autofillClient;
WebPermissionClient* m_permissionClient;
WebSpellCheckClient* m_spellCheckClient;
Vector<OwnPtr<WebCore::TextFieldDecorator> > m_textFieldDecorators;
ChromeClientImpl m_chromeClientImpl;
ContextMenuClientImpl m_contextMenuClientImpl;
DragClientImpl m_dragClientImpl;
EditorClientImpl m_editorClientImpl;
InspectorClientImpl m_inspectorClientImpl;
WebSize m_size;
bool m_shouldAutoResize;
WebCore::IntSize m_minAutoSize;
WebCore::IntSize m_maxAutoSize;
OwnPtr<WebCore::Page> m_page;
bool m_observedNewNavigation;
#ifndef NDEBUG
const WebCore::DocumentLoader* m_newNavigationLoader;
#endif
OwnPtr<WebSettingsImpl> m_webSettings;
RefPtr<WebCore::ChromiumDataObject> m_currentDragData;
WebPoint m_lastMouseDownPoint;
double m_zoomLevel;
double m_minimumZoomLevel;
double m_maximumZoomLevel;
float m_pageDefinedMinimumPageScaleFactor;
float m_pageDefinedMaximumPageScaleFactor;
float m_minimumPageScaleFactor;
float m_maximumPageScaleFactor;
bool m_pageScaleFactorIsSet;
bool m_contextMenuAllowed;
bool m_doingDragAndDrop;
bool m_ignoreInputEvents;
bool m_suppressNextKeypressEvent;
WebNavigationPolicy m_initialNavigationPolicy;
bool m_imeAcceptEvents;
WebDragOperation m_operationsAllowed;
WebDragOperation m_dragOperation;
bool m_autofillPopupShowing;
OwnPtr<AutofillPopupMenuClient> m_autofillPopupClient;
RefPtr<WebCore::PopupContainer> m_autofillPopup;
RefPtr<WebCore::PopupContainer> m_selectPopup;
#if ENABLE(PAGE_POPUP)
RefPtr<WebPagePopupImpl> m_pagePopup;
#endif
OwnPtr<WebDevToolsAgentPrivate> m_devToolsAgent;
OwnPtr<PageOverlayList> m_pageOverlays;
bool m_isTransparent;
bool m_tabsToLinks;
WebString m_inspectorSettings;
typedef HashMap<WTF::String, WTF::String> SettingsMap;
OwnPtr<SettingsMap> m_inspectorSettingsMap;
OwnPtr<DragScrollTimer> m_dragScrollTimer;
#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
NotificationPresenterImpl m_notificationPresenter;
#endif
RefPtr<WebCore::Node> m_mouseCaptureNode;
RefPtr<WebCore::Element> m_provisionalFullScreenElement;
RefPtr<WebCore::Frame> m_fullScreenFrame;
bool m_isCancelingFullScreen;
#if USE(ACCELERATED_COMPOSITING)
WebCore::IntRect m_rootLayerScrollDamage;
OwnPtr<NonCompositedContentHost> m_nonCompositedContentHost;
WebLayerTreeView m_layerTreeView;
WebLayer m_rootLayer;
WebCore::GraphicsLayer* m_rootGraphicsLayer;
bool m_isAcceleratedCompositingActive;
bool m_compositorCreationFailed;
bool m_recreatingGraphicsContext;
bool m_compositorSurfaceReady;
#endif
static const WebInputEvent* m_currentInputEvent;
#if ENABLE(INPUT_SPEECH)
OwnPtr<SpeechInputClientImpl> m_speechInputClient;
#endif
#if ENABLE(SCRIPTED_SPEECH)
OwnPtr<SpeechRecognitionClientProxy> m_speechRecognitionClient;
#endif
OwnPtr<WebGraphicsContext3D> m_temporaryOnscreenGraphicsContext3D;
OwnPtr<DeviceOrientationClientProxy> m_deviceOrientationClientProxy;
OwnPtr<GeolocationClientProxy> m_geolocationClientProxy;
#if ENABLE(BATTERY_STATUS)
OwnPtr<BatteryClientImpl> m_batteryClient;
#endif
float m_emulatedTextZoomFactor;
#if ENABLE(MEDIA_STREAM)
UserMediaClientImpl m_userMediaClientImpl;
#endif
OwnPtr<WebCore::ActivePlatformGestureAnimation> m_gestureAnimation;
WebPoint m_lastWheelPosition;
WebPoint m_lastWheelGlobalPosition;
int m_flingModifier;
};
}
#endif