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 "WebNavigationPolicy.h" 35 #include "WebPoint.h" 36 #include "WebRect.h" 37 #include "WebSize.h" 38 #include "WebString.h" 39 #include "WebView.h" 40 41 #include "ChromeClientImpl.h" 42 #include "ContextMenuClientImpl.h" 43 #include "DragClientImpl.h" 44 #include "EditorClientImpl.h" 45 #include "GraphicsContext3D.h" 46 #include "GraphicsLayer.h" 47 #include "InspectorClientImpl.h" 48 #include "IntRect.h" 49 #include "LayerRendererChromium.h" 50 #include "NotificationPresenterImpl.h" 51 #include <wtf/OwnPtr.h> 52 #include <wtf/RefCounted.h> 53 54 namespace WebCore { 55 class ChromiumDataObject; 56 class DocumentLoader; 57 class Frame; 58 class HistoryItem; 59 class HitTestResult; 60 class KeyboardEvent; 61 class Page; 62 class PlatformKeyboardEvent; 63 class PopupContainer; 64 class PopupMenuClient; 65 class Range; 66 class RenderTheme; 67 class Widget; 68 } 69 70 namespace WebKit { 71 class AutocompletePopupMenuClient; 72 class AutoFillPopupMenuClient; 73 class ContextMenuClientImpl; 74 class DeviceOrientationClientProxy; 75 class DragScrollTimer; 76 class GeolocationClientProxy; 77 class SpeechInputClientImpl; 78 class WebAccessibilityObject; 79 class WebDevToolsAgentClient; 80 class WebDevToolsAgentPrivate; 81 class WebFrameImpl; 82 class WebImage; 83 class WebKeyboardEvent; 84 class WebMouseEvent; 85 class WebMouseWheelEvent; 86 class WebSettingsImpl; 87 class WebTouchEvent; 88 89 class WebViewImpl : public WebView, public RefCounted<WebViewImpl> { 90 public: 91 // WebWidget methods: 92 virtual void close(); 93 virtual WebSize size() { return m_size; } 94 virtual void resize(const WebSize&); 95 virtual void animate(); 96 virtual void layout(); 97 virtual void paint(WebCanvas*, const WebRect&); 98 virtual void themeChanged(); 99 virtual void composite(bool finish); 100 virtual bool handleInputEvent(const WebInputEvent&); 101 virtual void mouseCaptureLost(); 102 virtual void setFocus(bool enable); 103 virtual bool setComposition( 104 const WebString& text, 105 const WebVector<WebCompositionUnderline>& underlines, 106 int selectionStart, 107 int selectionEnd); 108 virtual bool confirmComposition(); 109 virtual bool confirmComposition(const WebString& text); 110 virtual WebTextInputType textInputType(); 111 virtual WebRect caretOrSelectionBounds(); 112 virtual bool selectionRange(WebPoint& start, WebPoint& end) const; 113 virtual void setTextDirection(WebTextDirection direction); 114 virtual bool isAcceleratedCompositingActive() const; 115 116 // WebView methods: 117 virtual void initializeMainFrame(WebFrameClient*); 118 virtual void setDevToolsAgentClient(WebDevToolsAgentClient*); 119 virtual void setAutoFillClient(WebAutoFillClient*); 120 virtual void setSpellCheckClient(WebSpellCheckClient*); 121 virtual WebSettings* settings(); 122 virtual WebString pageEncoding() const; 123 virtual void setPageEncoding(const WebString& encoding); 124 virtual bool isTransparent() const; 125 virtual void setIsTransparent(bool value); 126 virtual bool tabsToLinks() const; 127 virtual void setTabsToLinks(bool value); 128 virtual bool tabKeyCyclesThroughElements() const; 129 virtual void setTabKeyCyclesThroughElements(bool value); 130 virtual bool isActive() const; 131 virtual void setIsActive(bool value); 132 virtual void setDomainRelaxationForbidden(bool, const WebString& scheme); 133 virtual bool dispatchBeforeUnloadEvent(); 134 virtual void dispatchUnloadEvent(); 135 virtual WebFrame* mainFrame(); 136 virtual WebFrame* findFrameByName( 137 const WebString& name, WebFrame* relativeToFrame); 138 virtual WebFrame* focusedFrame(); 139 virtual void setFocusedFrame(WebFrame* frame); 140 virtual void setInitialFocus(bool reverse); 141 virtual void clearFocusedNode(); 142 virtual void scrollFocusedNodeIntoView(); 143 virtual double zoomLevel(); 144 virtual double setZoomLevel(bool textOnly, double zoomLevel); 145 virtual void zoomLimitsChanged(double minimumZoomLevel, 146 double maximumZoomLevel); 147 virtual void performMediaPlayerAction( 148 const WebMediaPlayerAction& action, 149 const WebPoint& location); 150 virtual void copyImageAt(const WebPoint& point); 151 virtual void dragSourceEndedAt( 152 const WebPoint& clientPoint, 153 const WebPoint& screenPoint, 154 WebDragOperation operation); 155 virtual void dragSourceMovedTo( 156 const WebPoint& clientPoint, 157 const WebPoint& screenPoint, 158 WebDragOperation operation); 159 virtual void dragSourceSystemDragEnded(); 160 virtual WebDragOperation dragTargetDragEnter( 161 const WebDragData&, 162 const WebPoint& clientPoint, 163 const WebPoint& screenPoint, 164 WebDragOperationsMask operationsAllowed); 165 virtual WebDragOperation dragTargetDragOver( 166 const WebPoint& clientPoint, 167 const WebPoint& screenPoint, 168 WebDragOperationsMask operationsAllowed); 169 virtual void dragTargetDragLeave(); 170 virtual void dragTargetDrop( 171 const WebPoint& clientPoint, 172 const WebPoint& screenPoint); 173 virtual unsigned long createUniqueIdentifierForRequest(); 174 virtual void inspectElementAt(const WebPoint& point); 175 virtual WebString inspectorSettings() const; 176 virtual void setInspectorSettings(const WebString& settings); 177 virtual bool inspectorSetting(const WebString& key, WebString* value) const; 178 virtual void setInspectorSetting(const WebString& key, 179 const WebString& value); 180 virtual WebDevToolsAgent* devToolsAgent(); 181 virtual WebAccessibilityObject accessibilityObject(); 182 virtual void applyAutoFillSuggestions( 183 const WebNode&, 184 const WebVector<WebString>& names, 185 const WebVector<WebString>& labels, 186 const WebVector<WebString>& icons, 187 const WebVector<int>& uniqueIDs, 188 int separatorIndex); 189 virtual void hidePopups(); 190 virtual void setScrollbarColors(unsigned inactiveColor, 191 unsigned activeColor, 192 unsigned trackColor); 193 virtual void setSelectionColors(unsigned activeBackgroundColor, 194 unsigned activeForegroundColor, 195 unsigned inactiveBackgroundColor, 196 unsigned inactiveForegroundColor); 197 virtual void performCustomContextMenuAction(unsigned action); 198 199 // WebViewImpl 200 201 void setIgnoreInputEvents(bool newValue); 202 WebDevToolsAgentPrivate* devToolsAgentPrivate() { return m_devToolsAgent.get(); } 203 204 const WebPoint& lastMouseDownPoint() const 205 { 206 return m_lastMouseDownPoint; 207 } 208 209 WebCore::Frame* focusedWebCoreFrame() const; 210 211 // Returns the currently focused Node or null if no node has focus. 212 WebCore::Node* focusedWebCoreNode(); 213 214 static WebViewImpl* fromPage(WebCore::Page*); 215 216 WebViewClient* client() 217 { 218 return m_client; 219 } 220 221 WebAutoFillClient* autoFillClient() 222 { 223 return m_autoFillClient; 224 } 225 226 WebSpellCheckClient* spellCheckClient() 227 { 228 return m_spellCheckClient; 229 } 230 231 // Returns the page object associated with this view. This may be null when 232 // the page is shutting down, but will be valid at all other times. 233 WebCore::Page* page() const 234 { 235 return m_page.get(); 236 } 237 238 WebCore::RenderTheme* theme() const; 239 240 // Returns the main frame associated with this view. This may be null when 241 // the page is shutting down, but will be valid at all other times. 242 WebFrameImpl* mainFrameImpl(); 243 244 // History related methods: 245 void observeNewNavigation(); 246 247 // Event related methods: 248 void mouseMove(const WebMouseEvent&); 249 void mouseLeave(const WebMouseEvent&); 250 void mouseDown(const WebMouseEvent&); 251 void mouseUp(const WebMouseEvent&); 252 void mouseContextMenu(const WebMouseEvent&); 253 void mouseDoubleClick(const WebMouseEvent&); 254 bool mouseWheel(const WebMouseWheelEvent&); 255 bool keyEvent(const WebKeyboardEvent&); 256 bool charEvent(const WebKeyboardEvent&); 257 bool touchEvent(const WebTouchEvent&); 258 259 // Handles context menu events orignated via the the keyboard. These 260 // include the VK_APPS virtual key and the Shift+F10 combine. Code is 261 // based on the Webkit function bool WebView::handleContextMenuEvent(WPARAM 262 // wParam, LPARAM lParam) in webkit\webkit\win\WebView.cpp. The only 263 // significant change in this function is the code to convert from a 264 // Keyboard event to the Right Mouse button down event. 265 bool sendContextMenuEvent(const WebKeyboardEvent&); 266 267 // Notifies the WebView that a load has been committed. isNewNavigation 268 // will be true if a new session history item should be created for that 269 // load. 270 void didCommitLoad(bool* isNewNavigation); 271 272 // Returns true if popup menus should be rendered by the browser, false if 273 // they should be rendered by WebKit (which is the default). 274 static bool useExternalPopupMenus(); 275 276 bool contextMenuAllowed() const 277 { 278 return m_contextMenuAllowed; 279 } 280 281 // Set the disposition for how this webview is to be initially shown. 282 void setInitialNavigationPolicy(WebNavigationPolicy policy) 283 { 284 m_initialNavigationPolicy = policy; 285 } 286 WebNavigationPolicy initialNavigationPolicy() const 287 { 288 return m_initialNavigationPolicy; 289 } 290 291 // Determines whether a page should e.g. be opened in a background tab. 292 // Returns false if it has no opinion, in which case it doesn't set *policy. 293 static bool navigationPolicyFromMouseEvent( 294 unsigned short button, 295 bool ctrl, 296 bool shift, 297 bool alt, 298 bool meta, 299 WebNavigationPolicy*); 300 301 // Start a system drag and drop operation. 302 void startDragging( 303 const WebDragData& dragData, 304 WebDragOperationsMask mask, 305 const WebImage& dragImage, 306 const WebPoint& dragImageOffset); 307 308 void autoFillPopupDidHide() 309 { 310 m_autoFillPopupShowing = false; 311 } 312 313 #if ENABLE(NOTIFICATIONS) 314 // Returns the provider of desktop notifications. 315 NotificationPresenterImpl* notificationPresenterImpl(); 316 #endif 317 318 // Tries to scroll a frame or any parent of a frame. Returns true if the view 319 // was scrolled. 320 bool propagateScroll(WebCore::ScrollDirection, WebCore::ScrollGranularity); 321 322 // Notification that a popup was opened/closed. 323 void popupOpened(WebCore::PopupContainer* popupContainer); 324 void popupClosed(WebCore::PopupContainer* popupContainer); 325 326 void hideAutoFillPopup(); 327 328 // Returns the input event we're currently processing. This is used in some 329 // cases where the WebCore DOM event doesn't have the information we need. 330 static const WebInputEvent* currentInputEvent() 331 { 332 return m_currentInputEvent; 333 } 334 335 #if USE(ACCELERATED_COMPOSITING) 336 bool allowsAcceleratedCompositing(); 337 bool pageHasRTLStyle() const; 338 void setRootGraphicsLayer(WebCore::PlatformLayer*); 339 void setRootLayerNeedsDisplay(); 340 void scrollRootLayerRect(const WebCore::IntSize& scrollDelta, const WebCore::IntRect& clipRect); 341 void invalidateRootLayerRect(const WebCore::IntRect&); 342 #endif 343 344 // Returns the onscreen 3D context used by the compositor. This is 345 // used by the renderer's code to set up resource sharing between 346 // the compositor's context and subordinate contexts for APIs like 347 // WebGL. Returns 0 if compositing support is not compiled in. 348 virtual WebGraphicsContext3D* graphicsContext3D(); 349 350 WebCore::PopupContainer* selectPopup() const { return m_selectPopup.get(); } 351 352 // Returns true if the event leads to scrolling. 353 static bool mapKeyCodeForScroll(int keyCode, 354 WebCore::ScrollDirection* scrollDirection, 355 WebCore::ScrollGranularity* scrollGranularity); 356 357 // Called by a full frame plugin inside this view to inform it that its 358 // zoom level has been updated. The plugin should only call this function 359 // if the zoom change was triggered by the browser, it's only needed in case 360 // a plugin can update its own zoom, say because of its own UI. 361 void fullFramePluginZoomLevelChanged(double zoomLevel); 362 363 private: 364 friend class WebView; // So WebView::Create can call our constructor 365 friend class WTF::RefCounted<WebViewImpl>; 366 367 enum DragAction { 368 DragEnter, 369 DragOver 370 }; 371 372 WebViewImpl(WebViewClient*); 373 ~WebViewImpl(); 374 375 // Returns true if the event was actually processed. 376 bool keyEventDefault(const WebKeyboardEvent&); 377 378 // Returns true if the select popup has consumed the event. 379 bool selectPopupHandleKeyEvent(const WebKeyboardEvent&); 380 381 // Returns true if the autocomple has consumed the event. 382 bool autocompleteHandleKeyEvent(const WebKeyboardEvent&); 383 384 // Repaints the AutoFill popup. Should be called when the suggestions 385 // have changed. Note that this should only be called when the AutoFill 386 // popup is showing. 387 void refreshAutoFillPopup(); 388 389 // Returns true if the view was scrolled. 390 bool scrollViewWithKeyboard(int keyCode, int modifiers); 391 392 void hideSelectPopup(); 393 394 // Converts |pos| from window coordinates to contents coordinates and gets 395 // the HitTestResult for it. 396 WebCore::HitTestResult hitTestResultForWindowPos(const WebCore::IntPoint&); 397 398 // Consolidate some common code between starting a drag over a target and 399 // updating a drag over a target. If we're starting a drag, |isEntering| 400 // should be true. 401 WebDragOperation dragTargetDragEnterOrOver(const WebPoint& clientPoint, 402 const WebPoint& screenPoint, 403 DragAction); 404 405 #if USE(ACCELERATED_COMPOSITING) 406 void setIsAcceleratedCompositingActive(bool); 407 void doComposite(); 408 void doPixelReadbackToCanvas(WebCanvas*, const WebCore::IntRect&); 409 void reallocateRenderer(); 410 void updateLayerRendererViewport(); 411 #endif 412 413 WebViewClient* m_client; 414 WebAutoFillClient* m_autoFillClient; 415 WebSpellCheckClient* m_spellCheckClient; 416 417 ChromeClientImpl m_chromeClientImpl; 418 ContextMenuClientImpl m_contextMenuClientImpl; 419 DragClientImpl m_dragClientImpl; 420 EditorClientImpl m_editorClientImpl; 421 InspectorClientImpl m_inspectorClientImpl; 422 423 WebSize m_size; 424 425 WebPoint m_lastMousePosition; 426 OwnPtr<WebCore::Page> m_page; 427 428 // This flag is set when a new navigation is detected. It is used to satisfy 429 // the corresponding argument to WebFrameClient::didCommitProvisionalLoad. 430 bool m_observedNewNavigation; 431 #ifndef NDEBUG 432 // Used to assert that the new navigation we observed is the same navigation 433 // when we make use of m_observedNewNavigation. 434 const WebCore::DocumentLoader* m_newNavigationLoader; 435 #endif 436 437 // An object that can be used to manipulate m_page->settings() without linking 438 // against WebCore. This is lazily allocated the first time GetWebSettings() 439 // is called. 440 OwnPtr<WebSettingsImpl> m_webSettings; 441 442 // A copy of the web drop data object we received from the browser. 443 RefPtr<WebCore::ChromiumDataObject> m_currentDragData; 444 445 // The point relative to the client area where the mouse was last pressed 446 // down. This is used by the drag client to determine what was under the 447 // mouse when the drag was initiated. We need to track this here in 448 // WebViewImpl since DragClient::startDrag does not pass the position the 449 // mouse was at when the drag was initiated, only the current point, which 450 // can be misleading as it is usually not over the element the user actually 451 // dragged by the time a drag is initiated. 452 WebPoint m_lastMouseDownPoint; 453 454 // Keeps track of the current zoom level. 0 means no zoom, positive numbers 455 // mean zoom in, negative numbers mean zoom out. 456 double m_zoomLevel; 457 458 double m_minimumZoomLevel; 459 460 double m_maximumZoomLevel; 461 462 bool m_contextMenuAllowed; 463 464 bool m_doingDragAndDrop; 465 466 bool m_ignoreInputEvents; 467 468 // Webkit expects keyPress events to be suppressed if the associated keyDown 469 // event was handled. Safari implements this behavior by peeking out the 470 // associated WM_CHAR event if the keydown was handled. We emulate 471 // this behavior by setting this flag if the keyDown was handled. 472 bool m_suppressNextKeypressEvent; 473 474 // The policy for how this webview is to be initially shown. 475 WebNavigationPolicy m_initialNavigationPolicy; 476 477 // Represents whether or not this object should process incoming IME events. 478 bool m_imeAcceptEvents; 479 480 // The available drag operations (copy, move link...) allowed by the source. 481 WebDragOperation m_operationsAllowed; 482 483 // The current drag operation as negotiated by the source and destination. 484 // When not equal to DragOperationNone, the drag data can be dropped onto the 485 // current drop target in this WebView (the drop target can accept the drop). 486 WebDragOperation m_dragOperation; 487 488 // Whether an AutoFill popup is currently showing. 489 bool m_autoFillPopupShowing; 490 491 // The AutoFill popup client. 492 OwnPtr<AutoFillPopupMenuClient> m_autoFillPopupClient; 493 494 // The AutoFill popup. 495 RefPtr<WebCore::PopupContainer> m_autoFillPopup; 496 497 // The popup associated with a select element. 498 RefPtr<WebCore::PopupContainer> m_selectPopup; 499 500 OwnPtr<WebDevToolsAgentPrivate> m_devToolsAgent; 501 502 // Whether the webview is rendering transparently. 503 bool m_isTransparent; 504 505 // Whether the user can press tab to focus links. 506 bool m_tabsToLinks; 507 508 // Inspector settings. 509 WebString m_inspectorSettings; 510 511 typedef HashMap<WTF::String, WTF::String> SettingsMap; 512 OwnPtr<SettingsMap> m_inspectorSettingsMap; 513 OwnPtr<DragScrollTimer> m_dragScrollTimer; 514 515 #if ENABLE(NOTIFICATIONS) 516 // The provider of desktop notifications; 517 NotificationPresenterImpl m_notificationPresenter; 518 #endif 519 520 // If set, the (plugin) node which has mouse capture. 521 RefPtr<WebCore::Node> m_mouseCaptureNode; 522 523 #if USE(ACCELERATED_COMPOSITING) 524 WebCore::IntRect m_rootLayerScrollDamage; 525 RefPtr<WebCore::LayerRendererChromium> m_layerRenderer; 526 bool m_isAcceleratedCompositingActive; 527 bool m_compositorCreationFailed; 528 // If true, the graphics context is being restored. 529 bool m_recreatingGraphicsContext; 530 #endif 531 static const WebInputEvent* m_currentInputEvent; 532 533 #if ENABLE(INPUT_SPEECH) 534 OwnPtr<SpeechInputClientImpl> m_speechInputClient; 535 #endif 536 // If we attempt to fetch the on-screen GraphicsContext3D before 537 // the compositor has been turned on, we need to instantiate it 538 // early. This member holds on to the GC3D in this case. 539 RefPtr<WebCore::GraphicsContext3D> m_temporaryOnscreenGraphicsContext3D; 540 OwnPtr<DeviceOrientationClientProxy> m_deviceOrientationClientProxy; 541 OwnPtr<GeolocationClientProxy> m_geolocationClientProxy; 542 }; 543 544 } // namespace WebKit 545 546 #endif 547