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 "BackForwardClientImpl.h" 35 #include "ChromeClientImpl.h" 36 #include "ContextMenuClientImpl.h" 37 #include "DragClientImpl.h" 38 #include "EditorClientImpl.h" 39 #include "InspectorClientImpl.h" 40 #include "NotificationPresenterImpl.h" 41 #include "PageOverlayList.h" 42 #include "PageScaleConstraintsSet.h" 43 #include "PageWidgetDelegate.h" 44 #include "SpellCheckerClientImpl.h" 45 #include "UserMediaClientImpl.h" 46 #include "WebInputEvent.h" 47 #include "WebNavigationPolicy.h" 48 #include "WebView.h" 49 #include "core/page/PagePopupDriver.h" 50 #include "platform/Timer.h" 51 #include "platform/geometry/IntPoint.h" 52 #include "platform/geometry/IntRect.h" 53 #include "platform/graphics/GraphicsLayer.h" 54 #include "public/platform/WebGestureCurveTarget.h" 55 #include "public/platform/WebLayer.h" 56 #include "public/platform/WebPoint.h" 57 #include "public/platform/WebRect.h" 58 #include "public/platform/WebSize.h" 59 #include "public/platform/WebString.h" 60 #include "wtf/OwnPtr.h" 61 #include "wtf/RefCounted.h" 62 #include "wtf/Vector.h" 63 64 namespace WebCore { 65 class ChromiumDataObject; 66 class Color; 67 class Frame; 68 class GraphicsLayerFactory; 69 class HistoryItem; 70 class HitTestResult; 71 class KeyboardEvent; 72 class Page; 73 class PageGroup; 74 class PagePopup; 75 class PagePopupClient; 76 class PlatformKeyboardEvent; 77 class PopupContainer; 78 class PopupMenuClient; 79 class RenderLayerCompositor; 80 } 81 82 namespace blink { 83 class AutocompletePopupMenuClient; 84 class AutofillPopupMenuClient; 85 class ContextFeaturesClientImpl; 86 class ContextMenuClientImpl; 87 class GeolocationClientProxy; 88 class LinkHighlight; 89 class MIDIClientProxy; 90 class PinchViewports; 91 class PrerendererClientImpl; 92 class SharedWorkerRepositoryClientImpl; 93 class SpeechInputClientImpl; 94 class SpeechRecognitionClientProxy; 95 class UserMediaClientImpl; 96 class ValidationMessageClientImpl; 97 class WebAXObject; 98 class WebActiveGestureAnimation; 99 class WebDevToolsAgentClient; 100 class WebDevToolsAgentPrivate; 101 class WebDocument; 102 class WebFrameImpl; 103 class WebGestureEvent; 104 class WebHelperPluginImpl; 105 class WebImage; 106 class WebKeyboardEvent; 107 class WebLayerTreeView; 108 class WebMouseEvent; 109 class WebMouseWheelEvent; 110 class WebPagePopupImpl; 111 class WebPlugin; 112 class WebPrerendererClient; 113 class WebSettingsImpl; 114 class WebTouchEvent; 115 class WorkerGlobalScopeProxyProviderImpl; 116 class FullscreenController; 117 118 class WebViewImpl : public WebView 119 , public RefCounted<WebViewImpl> 120 , public WebGestureCurveTarget 121 , public WebCore::PagePopupDriver 122 , public PageWidgetEventHandler { 123 public: 124 static WebViewImpl* create(WebViewClient*); 125 126 // WebWidget methods: 127 virtual void close(); 128 virtual WebSize size(); 129 virtual void willStartLiveResize(); 130 virtual void resize(const WebSize&); 131 virtual void willEndLiveResize(); 132 virtual void willEnterFullScreen(); 133 virtual void didEnterFullScreen(); 134 virtual void willExitFullScreen(); 135 virtual void didExitFullScreen(); 136 virtual void animate(double); 137 virtual void layout(); 138 virtual void enterForceCompositingMode(bool enable) OVERRIDE; 139 virtual void paint(WebCanvas*, const WebRect&, PaintOptions = ReadbackFromCompositorIfAvailable); 140 virtual bool isTrackingRepaints() const OVERRIDE; 141 virtual void themeChanged(); 142 virtual bool handleInputEvent(const WebInputEvent&); 143 virtual void setCursorVisibilityState(bool isVisible); 144 virtual bool hasTouchEventHandlersAt(const WebPoint&); 145 virtual void applyScrollAndScale(const WebSize&, float); 146 virtual void mouseCaptureLost(); 147 virtual void setFocus(bool enable); 148 virtual bool setComposition( 149 const WebString& text, 150 const WebVector<WebCompositionUnderline>& underlines, 151 int selectionStart, 152 int selectionEnd); 153 virtual bool confirmComposition(); 154 virtual bool confirmComposition(ConfirmCompositionBehavior selectionBehavior); 155 virtual bool confirmComposition(const WebString& text); 156 virtual bool compositionRange(size_t* location, size_t* length); 157 virtual WebTextInputInfo textInputInfo(); 158 virtual bool setEditableSelectionOffsets(int start, int end); 159 virtual bool setCompositionFromExistingText(int compositionStart, int compositionEnd, const WebVector<WebCompositionUnderline>& underlines); 160 virtual void extendSelectionAndDelete(int before, int after); 161 virtual bool isSelectionEditable() const; 162 virtual WebColor backgroundColor() const; 163 virtual bool selectionBounds(WebRect& anchor, WebRect& focus) const; 164 virtual void didShowCandidateWindow(); 165 virtual void didUpdateCandidateWindow(); 166 virtual void didHideCandidateWindow(); 167 virtual bool selectionTextDirection(WebTextDirection& start, WebTextDirection& end) const; 168 virtual bool isSelectionAnchorFirst() const; 169 virtual bool caretOrSelectionRange(size_t* location, size_t* length); 170 virtual void setTextDirection(WebTextDirection direction); 171 virtual bool isAcceleratedCompositingActive() const; 172 virtual void willCloseLayerTreeView(); 173 virtual void didAcquirePointerLock(); 174 virtual void didNotAcquirePointerLock(); 175 virtual void didLosePointerLock(); 176 virtual void didChangeWindowResizerRect(); 177 virtual void didExitCompositingMode(); 178 179 // WebView methods: 180 virtual void setMainFrame(WebFrame*); 181 virtual void initializeMainFrame(WebFrameClient*); 182 virtual void setAutofillClient(WebAutofillClient*); 183 virtual void setDevToolsAgentClient(WebDevToolsAgentClient*); 184 virtual void setPermissionClient(WebPermissionClient*); 185 virtual void setPrerendererClient(WebPrerendererClient*) OVERRIDE; 186 virtual void setSpellCheckClient(WebSpellCheckClient*); 187 virtual void setValidationMessageClient(WebValidationMessageClient*) OVERRIDE; 188 virtual void setPasswordGeneratorClient(WebPasswordGeneratorClient*) OVERRIDE; 189 virtual void setSharedWorkerRepositoryClient(WebSharedWorkerRepositoryClient*) OVERRIDE; 190 virtual WebSettings* settings(); 191 virtual WebString pageEncoding() const; 192 virtual void setPageEncoding(const WebString& encoding); 193 virtual bool isTransparent() const; 194 virtual void setIsTransparent(bool value); 195 virtual void setBaseBackgroundColor(WebColor); 196 virtual bool tabsToLinks() const; 197 virtual void setTabsToLinks(bool value); 198 virtual bool tabKeyCyclesThroughElements() const; 199 virtual void setTabKeyCyclesThroughElements(bool value); 200 virtual bool isActive() const; 201 virtual void setIsActive(bool value); 202 virtual void setDomainRelaxationForbidden(bool, const WebString& scheme); 203 virtual void setWindowFeatures(const WebWindowFeatures&); 204 virtual bool dispatchBeforeUnloadEvent(); 205 virtual void dispatchUnloadEvent(); 206 virtual WebFrame* mainFrame(); 207 virtual WebFrame* findFrameByName( 208 const WebString& name, WebFrame* relativeToFrame); 209 virtual WebFrame* focusedFrame(); 210 virtual void setFocusedFrame(WebFrame* frame); 211 virtual void setInitialFocus(bool reverse); 212 virtual void clearFocusedNode(); 213 virtual void scrollFocusedNodeIntoView(); 214 virtual void scrollFocusedNodeIntoRect(const WebRect&); 215 virtual void zoomToFindInPageRect(const WebRect&); 216 virtual void advanceFocus(bool reverse); 217 virtual double zoomLevel(); 218 virtual double setZoomLevel(double); 219 virtual void zoomLimitsChanged(double minimumZoomLevel, 220 double maximumZoomLevel); 221 virtual float textZoomFactor(); 222 virtual float setTextZoomFactor(float); 223 virtual void setInitialPageScaleOverride(float); 224 virtual bool zoomToMultipleTargetsRect(const WebRect&); 225 virtual float pageScaleFactor() const; 226 virtual void setPageScaleFactorPreservingScrollOffset(float); 227 virtual void setPageScaleFactor(float scaleFactor, const WebPoint& origin); 228 virtual void setPageScaleFactorLimits(float minPageScale, float maxPageScale); 229 virtual float minimumPageScaleFactor() const; 230 virtual float maximumPageScaleFactor() const; 231 virtual void saveScrollAndScaleState(); 232 virtual void restoreScrollAndScaleState(); 233 virtual void resetScrollAndScaleState(); 234 virtual void setIgnoreViewportTagScaleLimits(bool); 235 virtual WebSize contentsPreferredMinimumSize(); 236 237 virtual float deviceScaleFactor() const; 238 virtual void setDeviceScaleFactor(float); 239 240 virtual void setFixedLayoutSize(const WebSize&); 241 242 virtual void enableAutoResizeMode( 243 const WebSize& minSize, 244 const WebSize& maxSize); 245 virtual void disableAutoResizeMode(); 246 virtual void performMediaPlayerAction( 247 const WebMediaPlayerAction& action, 248 const WebPoint& location); 249 virtual void performPluginAction( 250 const WebPluginAction&, 251 const WebPoint&); 252 virtual WebHitTestResult hitTestResultAt(const WebPoint&); 253 virtual void copyImageAt(const WebPoint& point); 254 virtual void dragSourceEndedAt( 255 const WebPoint& clientPoint, 256 const WebPoint& screenPoint, 257 WebDragOperation operation); 258 virtual void dragSourceMovedTo( 259 const WebPoint& clientPoint, 260 const WebPoint& screenPoint, 261 WebDragOperation operation); 262 virtual void dragSourceSystemDragEnded(); 263 virtual WebDragOperation dragTargetDragEnter( 264 const WebDragData&, 265 const WebPoint& clientPoint, 266 const WebPoint& screenPoint, 267 WebDragOperationsMask operationsAllowed, 268 int keyModifiers); 269 virtual WebDragOperation dragTargetDragOver( 270 const WebPoint& clientPoint, 271 const WebPoint& screenPoint, 272 WebDragOperationsMask operationsAllowed, 273 int keyModifiers); 274 virtual void dragTargetDragLeave(); 275 virtual void dragTargetDrop( 276 const WebPoint& clientPoint, 277 const WebPoint& screenPoint, 278 int keyModifiers); 279 virtual void spellingMarkers(WebVector<uint32_t>* markers); 280 virtual unsigned long createUniqueIdentifierForRequest(); 281 virtual void inspectElementAt(const WebPoint& point); 282 virtual WebString inspectorSettings() const; 283 virtual void setInspectorSettings(const WebString& settings); 284 virtual bool inspectorSetting(const WebString& key, WebString* value) const; 285 virtual void setInspectorSetting(const WebString& key, 286 const WebString& value); 287 virtual void setCompositorDeviceScaleFactorOverride(float); 288 virtual void setRootLayerTransform(const WebSize& offset, float scale); 289 virtual WebDevToolsAgent* devToolsAgent(); 290 virtual WebAXObject accessibilityObject(); 291 virtual void applyAutofillSuggestions( 292 const WebNode&, 293 const WebVector<WebString>& names, 294 const WebVector<WebString>& labels, 295 const WebVector<WebString>& icons, 296 const WebVector<int>& itemIDs, 297 int separatorIndex); 298 virtual void hidePopups(); 299 virtual void selectAutofillSuggestionAtIndex(unsigned listIndex); 300 virtual void setSelectionColors(unsigned activeBackgroundColor, 301 unsigned activeForegroundColor, 302 unsigned inactiveBackgroundColor, 303 unsigned inactiveForegroundColor); 304 virtual void performCustomContextMenuAction(unsigned action); 305 virtual void showContextMenu(); 306 virtual WebString getSmartClipData(WebRect); 307 virtual void addPageOverlay(WebPageOverlay*, int /* zOrder */); 308 virtual void removePageOverlay(WebPageOverlay*); 309 virtual void transferActiveWheelFlingAnimation(const WebActiveWheelFlingParameters&); 310 virtual bool endActiveFlingAnimation(); 311 virtual void setShowPaintRects(bool); 312 virtual void setShowDebugBorders(bool); 313 virtual void setShowFPSCounter(bool); 314 virtual void setContinuousPaintingEnabled(bool); 315 virtual void setShowScrollBottleneckRects(bool); 316 317 // WebViewImpl 318 319 void suppressInvalidations(bool enable); 320 void invalidateRect(const WebCore::IntRect&); 321 322 void setIgnoreInputEvents(bool newValue); 323 void setBackgroundColorOverride(WebColor); 324 void setZoomFactorOverride(float); 325 WebDevToolsAgentPrivate* devToolsAgentPrivate() { return m_devToolsAgent.get(); } 326 327 WebCore::Color baseBackgroundColor() const { return m_baseBackgroundColor; } 328 329 PageOverlayList* pageOverlays() const { return m_pageOverlays.get(); } 330 331 void setOverlayLayer(WebCore::GraphicsLayer*); 332 333 const WebPoint& lastMouseDownPoint() const 334 { 335 return m_lastMouseDownPoint; 336 } 337 338 WebCore::Frame* focusedWebCoreFrame() const; 339 340 // Returns the currently focused Element or null if no element has focus. 341 WebCore::Element* focusedElement(); 342 343 static WebViewImpl* fromPage(WebCore::Page*); 344 345 WebViewClient* client() 346 { 347 return m_client; 348 } 349 350 WebAutofillClient* autofillClient() 351 { 352 return m_autofillClient; 353 } 354 355 WebPermissionClient* permissionClient() 356 { 357 return m_permissionClient; 358 } 359 360 WebSpellCheckClient* spellCheckClient() 361 { 362 return m_spellCheckClient; 363 } 364 365 WebPasswordGeneratorClient* passwordGeneratorClient() const 366 { 367 return m_passwordGeneratorClient; 368 } 369 370 // Returns the page object associated with this view. This may be null when 371 // the page is shutting down, but will be valid at all other times. 372 WebCore::Page* page() const 373 { 374 return m_page.get(); 375 } 376 377 // Returns the main frame associated with this view. This may be null when 378 // the page is shutting down, but will be valid at all other times. 379 WebFrameImpl* mainFrameImpl(); 380 381 // Event related methods: 382 void mouseContextMenu(const WebMouseEvent&); 383 void mouseDoubleClick(const WebMouseEvent&); 384 385 bool detectContentOnTouch(const WebPoint&); 386 bool startPageScaleAnimation(const WebCore::IntPoint& targetPosition, bool useAnchor, float newScale, double durationInSeconds); 387 388 void numberOfWheelEventHandlersChanged(unsigned); 389 void hasTouchEventHandlers(bool); 390 391 // WebGestureCurveTarget implementation for fling. 392 virtual void scrollBy(const WebFloatSize&); 393 394 // Handles context menu events orignated via the the keyboard. These 395 // include the VK_APPS virtual key and the Shift+F10 combine. Code is 396 // based on the Webkit function bool WebView::handleContextMenuEvent(WPARAM 397 // wParam, LPARAM lParam) in webkit\webkit\win\WebView.cpp. The only 398 // significant change in this function is the code to convert from a 399 // Keyboard event to the Right Mouse button down event. 400 bool sendContextMenuEvent(const WebKeyboardEvent&); 401 402 // Notifies the WebView that a load has been committed. isNewNavigation 403 // will be true if a new session history item should be created for that 404 // load. isNavigationWithinPage will be true if the navigation does 405 // not take the user away from the current page. 406 void didCommitLoad(bool isNewNavigation, bool isNavigationWithinPage); 407 408 // Indicates two things: 409 // 1) This view may have a new layout now. 410 // 2) Calling layout() is a no-op. 411 // After calling WebWidget::layout(), expect to get this notification 412 // unless the view did not need a layout. 413 void layoutUpdated(WebFrameImpl*); 414 415 void didChangeContentsSize(); 416 void deviceOrPageScaleFactorChanged(); 417 418 // Returns true if popup menus should be rendered by the browser, false if 419 // they should be rendered by WebKit (which is the default). 420 static bool useExternalPopupMenus(); 421 422 bool contextMenuAllowed() const 423 { 424 return m_contextMenuAllowed; 425 } 426 427 bool shouldAutoResize() const 428 { 429 return m_shouldAutoResize; 430 } 431 432 WebCore::IntSize minAutoSize() const 433 { 434 return m_minAutoSize; 435 } 436 437 WebCore::IntSize maxAutoSize() const 438 { 439 return m_maxAutoSize; 440 } 441 442 void updateMainFrameLayoutSize(); 443 void updatePageDefinedViewportConstraints(const WebCore::ViewportDescription&); 444 445 // Start a system drag and drop operation. 446 void startDragging( 447 WebCore::Frame*, 448 const WebDragData& dragData, 449 WebDragOperationsMask mask, 450 const WebImage& dragImage, 451 const WebPoint& dragImageOffset); 452 453 void autofillPopupDidHide() 454 { 455 m_autofillPopupShowing = false; 456 } 457 458 // Returns the provider of desktop notifications. 459 NotificationPresenterImpl* notificationPresenterImpl(); 460 461 // Tries to scroll a frame or any parent of a frame. Returns true if the view 462 // was scrolled. 463 bool propagateScroll(WebCore::ScrollDirection, WebCore::ScrollGranularity); 464 465 // Notification that a popup was opened/closed. 466 void popupOpened(WebCore::PopupContainer* popupContainer); 467 void popupClosed(WebCore::PopupContainer* popupContainer); 468 // PagePopupDriver functions. 469 virtual WebCore::PagePopup* openPagePopup(WebCore::PagePopupClient*, const WebCore::IntRect& originBoundsInRootView) OVERRIDE; 470 virtual void closePagePopup(WebCore::PagePopup*) OVERRIDE; 471 472 void hideAutofillPopup(); 473 474 // Creates a Helper Plugin of |pluginType| for |hostDocument|. 475 WebHelperPluginImpl* createHelperPlugin(const String& pluginType, const WebDocument& hostDocument); 476 void closeHelperPluginSoon(PassRefPtr<WebHelperPluginImpl>); 477 478 // Returns the input event we're currently processing. This is used in some 479 // cases where the WebCore DOM event doesn't have the information we need. 480 static const WebInputEvent* currentInputEvent() 481 { 482 return m_currentInputEvent; 483 } 484 485 WebCore::GraphicsLayer* rootGraphicsLayer(); 486 bool allowsAcceleratedCompositing(); 487 void setRootGraphicsLayer(WebCore::GraphicsLayer*); 488 void scheduleCompositingLayerSync(); 489 void scrollRootLayerRect(const WebCore::IntSize& scrollDelta, const WebCore::IntRect& clipRect); 490 WebCore::GraphicsLayerFactory* graphicsLayerFactory() const; 491 WebCore::RenderLayerCompositor* compositor() const; 492 void registerForAnimations(WebLayer*); 493 void scheduleAnimation(); 494 495 virtual void setVisibilityState(WebPageVisibilityState, bool); 496 497 WebCore::PopupContainer* selectPopup() const { return m_selectPopup.get(); } 498 bool hasOpenedPopup() const { return m_selectPopup || m_pagePopup; } 499 500 // Returns true if the event leads to scrolling. 501 static bool mapKeyCodeForScroll(int keyCode, 502 WebCore::ScrollDirection* scrollDirection, 503 WebCore::ScrollGranularity* scrollGranularity); 504 505 // Called by a full frame plugin inside this view to inform it that its 506 // zoom level has been updated. The plugin should only call this function 507 // if the zoom change was triggered by the browser, it's only needed in case 508 // a plugin can update its own zoom, say because of its own UI. 509 void fullFramePluginZoomLevelChanged(double zoomLevel); 510 511 void computeScaleAndScrollForBlockRect(const WebPoint& hitPoint, const WebRect& blockRect, float padding, float defaultScaleWhenAlreadyLegible, float& scale, WebPoint& scroll); 512 WebCore::Node* bestTapNode(const WebCore::PlatformGestureEvent& tapEvent); 513 void enableTapHighlightAtPoint(const WebCore::PlatformGestureEvent& tapEvent); 514 void enableTapHighlights(Vector<WebCore::Node*>&); 515 void computeScaleAndScrollForFocusedNode(WebCore::Node* focusedNode, float& scale, WebCore::IntPoint& scroll, bool& needAnimation); 516 517 void animateDoubleTapZoom(const WebCore::IntPoint&); 518 519 void enableFakePageScaleAnimationForTesting(bool); 520 bool fakeDoubleTapAnimationPendingForTesting() const { return m_doubleTapZoomPending; } 521 WebCore::IntPoint fakePageScaleAnimationTargetPositionForTesting() const { return m_fakePageScaleAnimationTargetPosition; } 522 float fakePageScaleAnimationPageScaleForTesting() const { return m_fakePageScaleAnimationPageScaleFactor; } 523 bool fakePageScaleAnimationUseAnchorForTesting() const { return m_fakePageScaleAnimationUseAnchor; } 524 525 void enterFullScreenForElement(WebCore::Element*); 526 void exitFullScreenForElement(WebCore::Element*); 527 528 // Exposed for the purpose of overriding device metrics. 529 void sendResizeEventAndRepaint(); 530 531 // Exposed for testing purposes. 532 bool hasHorizontalScrollbar(); 533 bool hasVerticalScrollbar(); 534 535 // Pointer Lock calls allow a page to capture all mouse events and 536 // disable the system cursor. 537 virtual bool requestPointerLock(); 538 virtual void requestPointerUnlock(); 539 virtual bool isPointerLocked(); 540 541 // Heuristic-based function for determining if we should disable workarounds 542 // for viewing websites that are not optimized for mobile devices. 543 bool shouldDisableDesktopWorkarounds(); 544 545 // Exposed for tests. 546 unsigned numLinkHighlights() { return m_linkHighlights.size(); } 547 LinkHighlight* linkHighlight(int i) { return m_linkHighlights[i].get(); } 548 549 WebSettingsImpl* settingsImpl(); 550 551 // Returns the bounding box of the block type node touched by the WebRect. 552 WebRect computeBlockBounds(const WebRect&, bool ignoreClipping); 553 554 WebCore::IntPoint clampOffsetAtScale(const WebCore::IntPoint& offset, float scale); 555 556 // Exposed for tests. 557 WebVector<WebCompositionUnderline> compositionUnderlines() const; 558 559 WebLayerTreeView* layerTreeView() const { return m_layerTreeView; }; 560 561 private: 562 float legibleScale() const; 563 void refreshPageScaleFactorAfterLayout(); 564 void setUserAgentPageScaleConstraints(WebCore::PageScaleConstraints newConstraints); 565 float clampPageScaleFactorToLimits(float) const; 566 WebCore::IntSize contentsSize() const; 567 568 void resetSavedScrollAndScaleState(); 569 570 void updateMainFrameScrollPosition(const WebCore::IntPoint& scrollPosition, bool programmaticScroll); 571 572 friend class WebView; // So WebView::Create can call our constructor 573 friend class WTF::RefCounted<WebViewImpl>; 574 friend void setCurrentInputEventForTest(const WebInputEvent*); 575 576 enum DragAction { 577 DragEnter, 578 DragOver 579 }; 580 581 explicit WebViewImpl(WebViewClient*); 582 virtual ~WebViewImpl(); 583 584 WebTextInputType textInputType(); 585 586 WebString inputModeOfFocusedElement(); 587 588 // Returns true if the event was actually processed. 589 bool keyEventDefault(const WebKeyboardEvent&); 590 591 // Returns true if the autocomple has consumed the event. 592 bool autocompleteHandleKeyEvent(const WebKeyboardEvent&); 593 594 // Repaints the Autofill popup. Should be called when the suggestions 595 // have changed. Note that this should only be called when the Autofill 596 // popup is showing. 597 void refreshAutofillPopup(); 598 599 bool confirmComposition(const WebString& text, ConfirmCompositionBehavior); 600 601 // Returns true if the view was scrolled. 602 bool scrollViewWithKeyboard(int keyCode, int modifiers); 603 604 void hideSelectPopup(); 605 606 // Converts |pos| from window coordinates to contents coordinates and gets 607 // the HitTestResult for it. 608 WebCore::HitTestResult hitTestResultForWindowPos(const WebCore::IntPoint&); 609 610 // Consolidate some common code between starting a drag over a target and 611 // updating a drag over a target. If we're starting a drag, |isEntering| 612 // should be true. 613 WebDragOperation dragTargetDragEnterOrOver(const WebPoint& clientPoint, 614 const WebPoint& screenPoint, 615 DragAction, 616 int keyModifiers); 617 618 void configureAutoResizeMode(); 619 620 void setIsAcceleratedCompositingActive(bool); 621 void doComposite(); 622 void doPixelReadbackToCanvas(WebCanvas*, const WebCore::IntRect&); 623 void reallocateRenderer(); 624 void updateLayerTreeViewport(); 625 void updateLayerTreeBackgroundColor(); 626 void updateRootLayerTransform(); 627 void updateLayerTreeDeviceScaleFactor(); 628 629 // Helper function: Widens the width of |source| by the specified margins 630 // while keeping it smaller than page width. 631 WebRect widenRectWithinPageBounds(const WebRect& source, int targetMargin, int minimumMargin); 632 633 void pointerLockMouseEvent(const WebInputEvent&); 634 635 // PageWidgetEventHandler functions 636 virtual void handleMouseLeave(WebCore::Frame&, const WebMouseEvent&) OVERRIDE; 637 virtual void handleMouseDown(WebCore::Frame&, const WebMouseEvent&) OVERRIDE; 638 virtual void handleMouseUp(WebCore::Frame&, const WebMouseEvent&) OVERRIDE; 639 virtual bool handleMouseWheel(WebCore::Frame&, const WebMouseWheelEvent&) OVERRIDE; 640 virtual bool handleGestureEvent(const WebGestureEvent&) OVERRIDE; 641 virtual bool handleKeyEvent(const WebKeyboardEvent&) OVERRIDE; 642 virtual bool handleCharEvent(const WebKeyboardEvent&) OVERRIDE; 643 644 void closePendingHelperPlugins(WebCore::Timer<WebViewImpl>*); 645 646 WebCore::InputMethodContext* inputMethodContext(); 647 WebPlugin* focusedPluginIfInputMethodSupported(WebCore::Frame*); 648 649 WebViewClient* m_client; // Can be 0 (e.g. unittests, shared workers, etc.) 650 WebAutofillClient* m_autofillClient; 651 WebPermissionClient* m_permissionClient; 652 WebSpellCheckClient* m_spellCheckClient; 653 WebPasswordGeneratorClient* m_passwordGeneratorClient; 654 655 ChromeClientImpl m_chromeClientImpl; 656 ContextMenuClientImpl m_contextMenuClientImpl; 657 DragClientImpl m_dragClientImpl; 658 EditorClientImpl m_editorClientImpl; 659 InspectorClientImpl m_inspectorClientImpl; 660 BackForwardClientImpl m_backForwardClientImpl; 661 SpellCheckerClientImpl m_spellCheckerClientImpl; 662 663 WebSize m_size; 664 bool m_fixedLayoutSizeLock; 665 // If true, automatically resize the render view around its content. 666 bool m_shouldAutoResize; 667 // The lower bound on the size when auto-resizing. 668 WebCore::IntSize m_minAutoSize; 669 // The upper bound on the size when auto-resizing. 670 WebCore::IntSize m_maxAutoSize; 671 672 OwnPtr<WebCore::Page> m_page; 673 674 // An object that can be used to manipulate m_page->settings() without linking 675 // against WebCore. This is lazily allocated the first time GetWebSettings() 676 // is called. 677 OwnPtr<WebSettingsImpl> m_webSettings; 678 679 // A copy of the web drop data object we received from the browser. 680 RefPtr<WebCore::ChromiumDataObject> m_currentDragData; 681 682 // The point relative to the client area where the mouse was last pressed 683 // down. This is used by the drag client to determine what was under the 684 // mouse when the drag was initiated. We need to track this here in 685 // WebViewImpl since DragClient::startDrag does not pass the position the 686 // mouse was at when the drag was initiated, only the current point, which 687 // can be misleading as it is usually not over the element the user actually 688 // dragged by the time a drag is initiated. 689 WebPoint m_lastMouseDownPoint; 690 691 // Keeps track of the current zoom level. 0 means no zoom, positive numbers 692 // mean zoom in, negative numbers mean zoom out. 693 double m_zoomLevel; 694 695 double m_minimumZoomLevel; 696 697 double m_maximumZoomLevel; 698 699 PageScaleConstraintsSet m_pageScaleConstraintsSet; 700 701 // Saved page scale state. 702 float m_savedPageScaleFactor; // 0 means that no page scale factor is saved. 703 WebCore::IntSize m_savedScrollOffset; 704 705 // The scale moved to by the latest double tap zoom, if any. 706 float m_doubleTapZoomPageScaleFactor; 707 // Have we sent a double-tap zoom and not yet heard back the scale? 708 bool m_doubleTapZoomPending; 709 710 // Used for testing purposes. 711 bool m_enableFakePageScaleAnimationForTesting; 712 WebCore::IntPoint m_fakePageScaleAnimationTargetPosition; 713 float m_fakePageScaleAnimationPageScaleFactor; 714 bool m_fakePageScaleAnimationUseAnchor; 715 716 bool m_contextMenuAllowed; 717 718 bool m_doingDragAndDrop; 719 720 bool m_ignoreInputEvents; 721 722 float m_compositorDeviceScaleFactorOverride; 723 WebSize m_rootLayerOffset; 724 float m_rootLayerScale; 725 726 // Webkit expects keyPress events to be suppressed if the associated keyDown 727 // event was handled. Safari implements this behavior by peeking out the 728 // associated WM_CHAR event if the keydown was handled. We emulate 729 // this behavior by setting this flag if the keyDown was handled. 730 bool m_suppressNextKeypressEvent; 731 732 // Represents whether or not this object should process incoming IME events. 733 bool m_imeAcceptEvents; 734 735 // The available drag operations (copy, move link...) allowed by the source. 736 WebDragOperation m_operationsAllowed; 737 738 // The current drag operation as negotiated by the source and destination. 739 // When not equal to DragOperationNone, the drag data can be dropped onto the 740 // current drop target in this WebView (the drop target can accept the drop). 741 WebDragOperation m_dragOperation; 742 743 // Context-based feature switches. 744 OwnPtr<ContextFeaturesClientImpl> m_featureSwitchClient; 745 746 // Whether an Autofill popup is currently showing. 747 bool m_autofillPopupShowing; 748 749 // The Autofill popup client. 750 OwnPtr<AutofillPopupMenuClient> m_autofillPopupClient; 751 752 // The Autofill popup. 753 RefPtr<WebCore::PopupContainer> m_autofillPopup; 754 755 // The popup associated with a select element. 756 RefPtr<WebCore::PopupContainer> m_selectPopup; 757 758 // The popup associated with an input element. 759 RefPtr<WebPagePopupImpl> m_pagePopup; 760 761 OwnPtr<WebDevToolsAgentPrivate> m_devToolsAgent; 762 OwnPtr<PageOverlayList> m_pageOverlays; 763 764 // Whether the webview is rendering transparently. 765 bool m_isTransparent; 766 767 // Whether the user can press tab to focus links. 768 bool m_tabsToLinks; 769 770 // Inspector settings. 771 WebString m_inspectorSettings; 772 773 typedef HashMap<WTF::String, WTF::String> SettingsMap; 774 OwnPtr<SettingsMap> m_inspectorSettingsMap; 775 776 // The provider of desktop notifications; 777 NotificationPresenterImpl m_notificationPresenter; 778 779 // If set, the (plugin) node which has mouse capture. 780 RefPtr<WebCore::Node> m_mouseCaptureNode; 781 782 WebCore::IntRect m_rootLayerScrollDamage; 783 WebLayerTreeView* m_layerTreeView; 784 WebLayer* m_rootLayer; 785 WebCore::GraphicsLayer* m_rootGraphicsLayer; 786 OwnPtr<WebCore::GraphicsLayerFactory> m_graphicsLayerFactory; 787 bool m_isAcceleratedCompositingActive; 788 bool m_layerTreeViewCommitsDeferred; 789 bool m_compositorCreationFailed; 790 // If true, the graphics context is being restored. 791 bool m_recreatingGraphicsContext; 792 static const WebInputEvent* m_currentInputEvent; 793 OwnPtr<PinchViewports> m_pinchViewports; 794 795 #if ENABLE(INPUT_SPEECH) 796 OwnPtr<SpeechInputClientImpl> m_speechInputClient; 797 #endif 798 OwnPtr<SpeechRecognitionClientProxy> m_speechRecognitionClient; 799 800 OwnPtr<GeolocationClientProxy> m_geolocationClientProxy; 801 802 UserMediaClientImpl m_userMediaClientImpl; 803 OwnPtr<MIDIClientProxy> m_midiClientProxy; 804 #if ENABLE(NAVIGATOR_CONTENT_UTILS) 805 OwnPtr<NavigatorContentUtilsClientImpl> m_navigatorContentUtilsClient; 806 #endif 807 OwnPtr<WebActiveGestureAnimation> m_gestureAnimation; 808 WebPoint m_positionOnFlingStart; 809 WebPoint m_globalPositionOnFlingStart; 810 int m_flingModifier; 811 bool m_flingSourceDevice; 812 Vector<OwnPtr<LinkHighlight> > m_linkHighlights; 813 OwnPtr<ValidationMessageClientImpl> m_validationMessage; 814 OwnPtr<FullscreenController> m_fullscreenController; 815 OwnPtr<SharedWorkerRepositoryClientImpl> m_sharedWorkerRepositoryClient; 816 817 bool m_showFPSCounter; 818 bool m_showPaintRects; 819 bool m_showDebugBorders; 820 bool m_continuousPaintingEnabled; 821 bool m_showScrollBottleneckRects; 822 WebColor m_baseBackgroundColor; 823 WebColor m_backgroundColorOverride; 824 float m_zoomFactorOverride; 825 826 WebCore::Timer<WebViewImpl> m_helperPluginCloseTimer; 827 Vector<RefPtr<WebHelperPluginImpl> > m_helperPluginsPendingClose; 828 }; 829 830 inline WebViewImpl* toWebViewImpl(WebView* webView) 831 { 832 // We have no ways to check if the specified WebView is an instance of 833 // WebViewImpl because WebViewImpl is the only implementation of WebView. 834 return static_cast<WebViewImpl*>(webView); 835 } 836 837 } // namespace blink 838 839 #endif 840