Changeset 148278 in webkit


Ignore:
Timestamp:
Apr 12, 2013 8:13:49 AM (11 years ago)
Author:
akling@apple.com
Message:

REGRESSION(r145869): Right-click on SWF contents displays the context menu at the wrong place.
<http://webkit.org/b/113836>
<rdar://problem/13587624>

Reviewed by Anders "Wesley Crusher" Carlsson.

Mac plugins expect flipped-Y screen coordinates, while DOM APIs speak in unflipped coordinates,
and we were mixing them up in the window frame caching optimization.

Solve this by having the UIProcess send both flipped and unflipped window frames to the WebProcess.
The flipped frame is passed on to plugins, and the unflipped frame is used for window.screenX/Y etc.

  • UIProcess/API/mac/WKView.mm:

(-[WKView _updateWindowAndViewFrames]):

No need to retrieve the window frame here as WebPageProxy::windowAndViewFramesChanged() will
always override it anyway.

  • UIProcess/mac/WebPageProxyMac.mm:

(WebKit::WebPageProxy::windowAndViewFramesChanged):

  • WebProcess/WebCoreSupport/WebChromeClient.cpp:

(WebKit::WebChromeClient::windowRect):

  • WebProcess/WebPage/WebPage.cpp:

(WebKit::WebPage::windowAndViewFramesChanged):

  • WebProcess/WebPage/WebPage.h:

(WebKit::WebPage::windowFrameInUnflippedScreenCoordinates):

  • WebProcess/WebPage/WebPage.messages.in:
Location:
trunk/Source/WebKit2
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r148274 r148278  
     12013-04-12  Andreas Kling  <akling@apple.com>
     2
     3        REGRESSION(r145869): Right-click on SWF contents displays the context menu at the wrong place.
     4        <http://webkit.org/b/113836>
     5        <rdar://problem/13587624>
     6
     7        Reviewed by Anders "Wesley Crusher" Carlsson.
     8
     9        Mac plugins expect flipped-Y screen coordinates, while DOM APIs speak in unflipped coordinates,
     10        and we were mixing them up in the window frame caching optimization.
     11
     12        Solve this by having the UIProcess send both flipped and unflipped window frames to the WebProcess.
     13        The flipped frame is passed on to plugins, and the unflipped frame is used for window.screenX/Y etc.
     14
     15        * UIProcess/API/mac/WKView.mm:
     16        (-[WKView _updateWindowAndViewFrames]):
     17
     18            No need to retrieve the window frame here as WebPageProxy::windowAndViewFramesChanged() will
     19            always override it anyway.
     20
     21        * UIProcess/mac/WebPageProxyMac.mm:
     22        (WebKit::WebPageProxy::windowAndViewFramesChanged):
     23        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
     24        (WebKit::WebChromeClient::windowRect):
     25        * WebProcess/WebPage/WebPage.cpp:
     26        (WebKit::WebPage::windowAndViewFramesChanged):
     27        * WebProcess/WebPage/WebPage.h:
     28        (WebKit::WebPage::windowFrameInUnflippedScreenCoordinates):
     29        * WebProcess/WebPage/WebPage.messages.in:
     30
    1312013-04-12  Mikhail Pozdnyakov  <mikhail.pozdnyakov@intel.com>
    232
  • trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm

    r146673 r148278  
    397397- (void)_updateWindowAndViewFrames
    398398{
    399     NSWindow *window = [self window];
    400     ASSERT(window);
    401    
    402     NSRect windowFrameInScreenCoordinates = [window frame];
    403399    NSRect viewFrameInWindowCoordinates = [self convertRect:[self frame] toView:nil];
    404400    NSPoint accessibilityPosition = [[self accessibilityAttributeValue:NSAccessibilityPositionAttribute] pointValue];
    405401   
    406     _data->_page->windowAndViewFramesChanged(windowFrameInScreenCoordinates, viewFrameInWindowCoordinates, accessibilityPosition);
     402    _data->_page->windowAndViewFramesChanged(viewFrameInWindowCoordinates, accessibilityPosition);
    407403    if (_data->_expandsToFitContentViaAutoLayout)
    408404        _data->_page->viewExposedRectChanged([self visibleRect]);
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r147403 r148278  
    383383#if PLATFORM(MAC)
    384384    void updateWindowIsVisible(bool windowIsVisible);
    385     void windowAndViewFramesChanged(const WebCore::FloatRect& windowFrameInScreenCoordinates, const WebCore::FloatRect& viewFrameInWindowCoordinates, const WebCore::FloatPoint& accessibilityViewCoordinates);
     385    void windowAndViewFramesChanged(const WebCore::FloatRect& viewFrameInWindowCoordinates, const WebCore::FloatPoint& accessibilityViewCoordinates);
    386386    void viewExposedRectChanged(const WebCore::FloatRect& exposedRect);
    387387    void setMainFrameIsScrollable(bool);
  • trunk/Source/WebKit2/UIProcess/mac/WebPageProxyMac.mm

    r146143 r148278  
    139139}
    140140
    141 void WebPageProxy::windowAndViewFramesChanged(const FloatRect& windowFrameInScreenCoordinates, const FloatRect& viewFrameInWindowCoordinates, const FloatPoint& accessibilityViewCoordinates)
     141void WebPageProxy::windowAndViewFramesChanged(const FloatRect& viewFrameInWindowCoordinates, const FloatPoint& accessibilityViewCoordinates)
    142142{
    143143    if (!isValid())
     
    145145
    146146    // In case the UI client overrides getWindowFrame(), we call it here to make sure we send the appropriate window frame.
    147     FloatRect adjustedWindowFrameInScreenCoordinates;
    148     getWindowFrame(adjustedWindowFrameInScreenCoordinates);
    149 
    150     process()->send(Messages::WebPage::WindowAndViewFramesChanged(adjustedWindowFrameInScreenCoordinates, viewFrameInWindowCoordinates, accessibilityViewCoordinates), m_pageID);
     147    FloatRect windowFrameInScreenCoordinates = m_uiClient.windowFrame(this);
     148    FloatRect windowFrameInUnflippedScreenCoordinates = m_pageClient->convertToUserSpace(windowFrameInScreenCoordinates);
     149
     150    process()->send(Messages::WebPage::WindowAndViewFramesChanged(windowFrameInScreenCoordinates, windowFrameInUnflippedScreenCoordinates, viewFrameInWindowCoordinates, accessibilityViewCoordinates), m_pageID);
    151151}
    152152
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp

    r145230 r148278  
    115115#if PLATFORM(MAC)
    116116    if (m_page->hasCachedWindowFrame())
    117         return m_page->windowFrameInScreenCoordinates();
     117        return m_page->windowFrameInUnflippedScreenCoordinates();
    118118#endif
    119119
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp

    r148253 r148278  
    29702970}
    29712971
    2972 void WebPage::windowAndViewFramesChanged(const FloatRect& windowFrameInScreenCoordinates, const FloatRect& viewFrameInWindowCoordinates, const FloatPoint& accessibilityViewCoordinates)
     2972void WebPage::windowAndViewFramesChanged(const FloatRect& windowFrameInScreenCoordinates, const FloatRect& windowFrameInUnflippedScreenCoordinates, const FloatRect& viewFrameInWindowCoordinates, const FloatPoint& accessibilityViewCoordinates)
    29732973{
    29742974    m_windowFrameInScreenCoordinates = windowFrameInScreenCoordinates;
     2975    m_windowFrameInUnflippedScreenCoordinates = windowFrameInUnflippedScreenCoordinates;
    29752976    m_viewFrameInWindowCoordinates = viewFrameInWindowCoordinates;
    29762977    m_accessibilityPosition = accessibilityViewCoordinates;
     
    29802981        (*it)->windowAndViewFramesChanged(enclosingIntRect(windowFrameInScreenCoordinates), enclosingIntRect(viewFrameInWindowCoordinates));
    29812982
    2982     m_hasCachedWindowFrame = !m_windowFrameInScreenCoordinates.isEmpty();
     2983    m_hasCachedWindowFrame = !m_windowFrameInUnflippedScreenCoordinates.isEmpty();
    29832984}
    29842985#endif
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h

    r148249 r148278  
    362362    void updatePluginsActiveAndFocusedState();
    363363    const WebCore::FloatRect& windowFrameInScreenCoordinates() const { return m_windowFrameInScreenCoordinates; }
     364    const WebCore::FloatRect& windowFrameInUnflippedScreenCoordinates() const { return m_windowFrameInUnflippedScreenCoordinates; }
    364365    const WebCore::FloatRect& viewFrameInWindowCoordinates() const { return m_viewFrameInWindowCoordinates; }
    365366
     
    758759
    759760    void setWindowIsVisible(bool windowIsVisible);
    760     void windowAndViewFramesChanged(const WebCore::FloatRect& windowFrameInScreenCoordinates, const WebCore::FloatRect& viewFrameInWindowCoordinates, const WebCore::FloatPoint& accessibilityViewCoordinates);
     761    void windowAndViewFramesChanged(const WebCore::FloatRect& windowFrameInScreenCoordinates, const WebCore::FloatRect& windowFrameInUnflippedScreenCoordinates, const WebCore::FloatRect& viewFrameInWindowCoordinates, const WebCore::FloatPoint& accessibilityViewCoordinates);
    761762
    762763    RetainPtr<PDFDocument> pdfDocumentForPrintingFrame(WebCore::Frame*);
     
    885886    // The frame of the containing window in screen coordinates.
    886887    WebCore::FloatRect m_windowFrameInScreenCoordinates;
     888
     889    // The frame of the containing window in unflipped screen coordinates.
     890    WebCore::FloatRect m_windowFrameInUnflippedScreenCoordinates;
    887891
    888892    // The frame of the view in window coordinates.
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in

    r145845 r148278  
    261261
    262262    SetWindowIsVisible(bool windowIsVisible)
    263     WindowAndViewFramesChanged(WebCore::FloatRect windowFrameInScreenCoordinates, WebCore::FloatRect viewFrameInWindowCoordinates, WebCore::FloatPoint accessibilityViewCoordinates)
     263    WindowAndViewFramesChanged(WebCore::FloatRect windowFrameInScreenCoordinates, WebCore::FloatRect windowFrameInUnflippedScreenCoordinates, WebCore::FloatRect viewFrameInWindowCoordinates, WebCore::FloatPoint accessibilityViewCoordinates)
    264264    ViewExposedRectChanged(WebCore::FloatRect exposedRect)
    265265    SetMainFrameIsScrollable(bool isScrollable)
Note: See TracChangeset for help on using the changeset viewer.