Title: [136178] trunk/Source/WebKit2
Revision
136178
Author
[email protected]
Date
2012-11-29 16:01:59 -0800 (Thu, 29 Nov 2012)

Log Message

Add a minimumLayoutWidth WKView property
https://bugs.webkit.org/show_bug.cgi?id=103660
<rdar://problem/11791729>

Reviewed by Beth Dakin.

When minimumLayoutWidth is set to a positive value, the WKView will update its intrinsic content size given the layout width.

* UIProcess/API/mac/PageClientImpl.h:
* UIProcess/API/mac/PageClientImpl.mm:
(WebKit::PageClientImpl::intrinsicContentSizeDidChange):
Call the WKView.

* UIProcess/API/mac/WKView.mm:
(-[WKView intrinsicContentSize]):
Override the intrinsicContentSize getter.

(-[WKView _setIntrinsicContentSize:]):
Update the intrinsic content size and mark it as invalid.

(-[WKView initWithFrame:contextRef:pageGroupRef:relatedToPage:]):
By default, the WKView should have no intrinsic size.

(-[WKView minimumLayoutWidth]):
(-[WKView setMinimumLayoutWidth:]):
Call through to the WebPageProxy object.

* UIProcess/API/mac/WKViewPrivate.h:
Add the SPI here.

* UIProcess/DrawingAreaProxy.h:
(WebKit::DrawingAreaProxy::minimumLayoutWidthDidChange):
(WebKit::DrawingAreaProxy::didUpdateGeometry):
(WebKit::DrawingAreaProxy::intrinsicContentSizeDidChange):
Add empty stubs.

* UIProcess/DrawingAreaProxy.messages.in:
Update the DidUpdateGeometry signature and add IntrinsicContentSizeDidChange.

* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::WebPageProxy):
Initialize the minimum layout width.

(WebKit::WebPageProxy::setMinimumLayoutWidth):
Update the minimum layout width and call the drawing area proxy.

* UIProcess/WebPageProxy.h:
(WebKit::WebPageProxy::minimumLayoutWidth):
Add getter.

* UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h:
(TiledCoreAnimationDrawingAreaProxy):
* UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm:
(WebKit::TiledCoreAnimationDrawingAreaProxy::minimumLayoutWidthDidChange):
Update the geometry if needed.

(WebKit::TiledCoreAnimationDrawingAreaProxy::didUpdateGeometry):
Update the intrinsic content size.

(WebKit::TiledCoreAnimationDrawingAreaProxy::intrinsicContentSizeDidChange):
Call through to WebPageProxy::intrinsicContentSizeDidChange.

(WebKit::TiledCoreAnimationDrawingAreaProxy::sendUpdateGeometry):
Pass along the minimum layout width.

* UIProcess/mac/WebPageProxyMac.mm:
(WebKit::WebPageProxy::intrinsicContentSizeDidChange):
Call through to the page client.

* WebProcess/WebCoreSupport/WebChromeClient.cpp:
(WebKit::WebChromeClient::contentsSizeChanged):
Call DrawingArea::mainFrameContentSizeChanged.

* WebProcess/WebPage/DrawingArea.h:
(WebKit::DrawingArea::mainFrameContentSizeChanged):
Add empty stub.

(WebKit::DrawingArea::updateGeometry):
Update signature.

* WebProcess/WebPage/DrawingArea.messages.in:
Add minimumLayoutWidth to UpdateGeometry.

* WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h:
* WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
(WebKit::TiledCoreAnimationDrawingArea::mainFrameContentSizeChanged):
If the content size change is not coming from updateGeometry, send an InstrinsicContentSizeDidChange message.

(WebKit::TiledCoreAnimationDrawingArea::updateGeometry):
If m_minimumLayoutWidth is positive, do an initial layout pass to figure out the height of the page and then do another
layout with the viewport set to that height.

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (136177 => 136178)


--- trunk/Source/WebKit2/ChangeLog	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/ChangeLog	2012-11-30 00:01:59 UTC (rev 136178)
@@ -1,5 +1,99 @@
 2012-11-29  Anders Carlsson  <[email protected]>
 
+        Add a minimumLayoutWidth WKView property
+        https://bugs.webkit.org/show_bug.cgi?id=103660
+        <rdar://problem/11791729>
+
+        Reviewed by Beth Dakin.
+
+        When minimumLayoutWidth is set to a positive value, the WKView will update its intrinsic content size given the layout width.
+
+        * UIProcess/API/mac/PageClientImpl.h:
+        * UIProcess/API/mac/PageClientImpl.mm:
+        (WebKit::PageClientImpl::intrinsicContentSizeDidChange):
+        Call the WKView.
+
+        * UIProcess/API/mac/WKView.mm:
+        (-[WKView intrinsicContentSize]):
+        Override the intrinsicContentSize getter.
+
+        (-[WKView _setIntrinsicContentSize:]):
+        Update the intrinsic content size and mark it as invalid.
+
+        (-[WKView initWithFrame:contextRef:pageGroupRef:relatedToPage:]):
+        By default, the WKView should have no intrinsic size.
+
+        (-[WKView minimumLayoutWidth]):
+        (-[WKView setMinimumLayoutWidth:]):
+        Call through to the WebPageProxy object.
+
+        * UIProcess/API/mac/WKViewPrivate.h:
+        Add the SPI here.
+
+        * UIProcess/DrawingAreaProxy.h:
+        (WebKit::DrawingAreaProxy::minimumLayoutWidthDidChange):
+        (WebKit::DrawingAreaProxy::didUpdateGeometry):
+        (WebKit::DrawingAreaProxy::intrinsicContentSizeDidChange):
+        Add empty stubs.
+
+        * UIProcess/DrawingAreaProxy.messages.in:
+        Update the DidUpdateGeometry signature and add IntrinsicContentSizeDidChange.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::WebPageProxy):
+        Initialize the minimum layout width.
+
+        (WebKit::WebPageProxy::setMinimumLayoutWidth):
+        Update the minimum layout width and call the drawing area proxy.
+
+        * UIProcess/WebPageProxy.h:
+        (WebKit::WebPageProxy::minimumLayoutWidth):
+        Add getter.
+
+        * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h:
+        (TiledCoreAnimationDrawingAreaProxy):
+        * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm:
+        (WebKit::TiledCoreAnimationDrawingAreaProxy::minimumLayoutWidthDidChange):
+        Update the geometry if needed.
+
+        (WebKit::TiledCoreAnimationDrawingAreaProxy::didUpdateGeometry):
+        Update the intrinsic content size.
+
+        (WebKit::TiledCoreAnimationDrawingAreaProxy::intrinsicContentSizeDidChange):
+        Call through to WebPageProxy::intrinsicContentSizeDidChange.
+
+        (WebKit::TiledCoreAnimationDrawingAreaProxy::sendUpdateGeometry):
+        Pass along the minimum layout width.
+
+        * UIProcess/mac/WebPageProxyMac.mm:
+        (WebKit::WebPageProxy::intrinsicContentSizeDidChange):
+        Call through to the page client.
+
+        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
+        (WebKit::WebChromeClient::contentsSizeChanged):
+        Call DrawingArea::mainFrameContentSizeChanged.
+
+        * WebProcess/WebPage/DrawingArea.h:
+        (WebKit::DrawingArea::mainFrameContentSizeChanged):
+        Add empty stub.
+
+        (WebKit::DrawingArea::updateGeometry):
+        Update signature.
+
+        * WebProcess/WebPage/DrawingArea.messages.in:
+        Add minimumLayoutWidth to UpdateGeometry.
+
+        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h:
+        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
+        (WebKit::TiledCoreAnimationDrawingArea::mainFrameContentSizeChanged):
+        If the content size change is not coming from updateGeometry, send an InstrinsicContentSizeDidChange message.
+
+        (WebKit::TiledCoreAnimationDrawingArea::updateGeometry):
+        If m_minimumLayoutWidth is positive, do an initial layout pass to figure out the height of the page and then do another
+        layout with the viewport set to that height.
+
+2012-11-29  Anders Carlsson  <[email protected]>
+
         CoreIPC::Connection should retain its xpc_connection_t
         https://bugs.webkit.org/show_bug.cgi?id=103671
         <rdar://problem/12717331>

Modified: trunk/Source/WebKit2/UIProcess/API/mac/PageClientImpl.h (136177 => 136178)


--- trunk/Source/WebKit2/UIProcess/API/mac/PageClientImpl.h	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/UIProcess/API/mac/PageClientImpl.h	2012-11-30 00:01:59 UTC (rev 136178)
@@ -139,6 +139,7 @@
     virtual void recommendedScrollbarStyleDidChange(int32_t newStyle);
 
     virtual WKView* wkView() const { return m_wkView; }
+    virtual void intrinsicContentSizeDidChange(const WebCore::IntSize& intrinsicContentSize) OVERRIDE;
 
 #if USE(DICTATION_ALTERNATIVES)
     virtual uint64_t addDictationAlternatives(const RetainPtr<NSTextAlternatives>&);

Modified: trunk/Source/WebKit2/UIProcess/API/mac/PageClientImpl.mm (136177 => 136178)


--- trunk/Source/WebKit2/UIProcess/API/mac/PageClientImpl.mm	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/UIProcess/API/mac/PageClientImpl.mm	2012-11-30 00:01:59 UTC (rev 136178)
@@ -558,6 +558,11 @@
 #endif
 }
 
+void PageClientImpl::intrinsicContentSizeDidChange(const IntSize& intrinsicContentSize)
+{
+    [m_wkView _setIntrinsicContentSize:intrinsicContentSize];
+}
+
 bool PageClientImpl::executeSavedCommandBySelector(const String& selectorString)
 {
     return [m_wkView _executeSavedCommandBySelector:NSSelectorFromString(selectorString)];

Modified: trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm (136177 => 136178)


--- trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm	2012-11-30 00:01:59 UTC (rev 136178)
@@ -215,6 +215,8 @@
     RefPtr<WebCore::Image> _promisedImage;
     String _promisedFilename;
     String _promisedURL;
+
+    NSSize _intrinsicContentSize;
 }
 
 @end
@@ -356,6 +358,11 @@
     return YES;
 }
 
+- (NSSize)intrinsicContentSize
+{
+    return _data->_intrinsicContentSize;
+}
+
 - (void)setFrameSize:(NSSize)size
 {
     if (!NSEqualSizes(size, [self frame].size))
@@ -2925,6 +2932,12 @@
     return ![sink.get() didReceiveUnhandledCommand];
 }
 
+- (void)_setIntrinsicContentSize:(NSSize)intrinsicContentSize
+{
+    _data->_intrinsicContentSize = intrinsicContentSize;
+    [self invalidateIntrinsicContentSize];
+}
+
 - (void)_cacheWindowBottomCornerRect
 {
 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
@@ -3021,6 +3034,8 @@
     _data->_mouseDownEvent = nil;
     _data->_ignoringMouseDraggedEvents = NO;
 
+    _data->_intrinsicContentSize = NSMakeSize(NSViewNoInstrinsicMetric, NSViewNoInstrinsicMetric);
+
     [self _registerDraggedTypes];
 
     if ([self _shouldUseTiledDrawingArea]) {
@@ -3126,6 +3141,16 @@
 #endif
 }
 
+- (CGFloat)minimumLayoutWidth
+{
+    return _data->_page->minimumLayoutWidth();
+}
+
+- (void)setMinimumLayoutWidth:(CGFloat)minimumLayoutWidth
+{
+    _data->_page->setMinimumLayoutWidth(minimumLayoutWidth);
+}
+
 @end
 
 @implementation WKResponderChainSink

Modified: trunk/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h (136177 => 136178)


--- trunk/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h	2012-11-30 00:01:59 UTC (rev 136178)
@@ -61,6 +61,7 @@
 - (BOOL)_interpretKeyEvent:(NSEvent *)theEvent savingCommandsTo:(Vector<WebCore::KeypressCommand>&)commands;
 - (void)_doneWithKeyEvent:(NSEvent *)event eventWasHandled:(BOOL)eventWasHandled;
 - (bool)_executeSavedCommandBySelector:(SEL)selector;
+- (void)_setIntrinsicContentSize:(NSSize)intrinsicContentSize;
 - (NSRect)_convertToDeviceSpace:(NSRect)rect;
 - (NSRect)_convertToUserSpace:(NSRect)rect;
 - (void)_setFindIndicator:(PassRefPtr<WebKit::FindIndicator>)findIndicator fadeOut:(BOOL)fadeOut animate:(BOOL)animate;

Modified: trunk/Source/WebKit2/UIProcess/API/mac/WKViewPrivate.h (136177 => 136178)


--- trunk/Source/WebKit2/UIProcess/API/mac/WKViewPrivate.h	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/UIProcess/API/mac/WKViewPrivate.h	2012-11-30 00:01:59 UTC (rev 136178)
@@ -50,4 +50,6 @@
 - (void)performDictionaryLookupAtCurrentMouseLocation;
 + (void)hideWordDefinitionWindow;
 
+@property (readwrite) CGFloat minimumLayoutWidth;
+
 @end

Modified: trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h (136177 => 136178)


--- trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h	2012-11-30 00:01:59 UTC (rev 136178)
@@ -81,6 +81,7 @@
     virtual void waitForPossibleGeometryUpdate() { }
 
     virtual void colorSpaceDidChange() { }
+    virtual void minimumLayoutWidthDidChange() { }
 
 #if USE(COORDINATED_GRAPHICS)
     virtual void updateViewport();
@@ -118,7 +119,8 @@
     virtual void updateAcceleratedCompositingMode(uint64_t /* backingStoreStateID */, const LayerTreeContext&) { }
 #endif
 #if PLATFORM(MAC)
-    virtual void didUpdateGeometry() { }
+    virtual void didUpdateGeometry(const WebCore::IntSize& newIntrinsicContentSize) { }
+    virtual void intrinsicContentSizeDidChange(const WebCore::IntSize& newIntrinsicContentSize) { }
 #endif
 };
 

Modified: trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.messages.in (136177 => 136178)


--- trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.messages.in	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.messages.in	2012-11-30 00:01:59 UTC (rev 136178)
@@ -31,6 +31,7 @@
 
 #if PLATFORM(MAC)
     // Used by TiledCoreAnimationDrawingAreaProxy.
-    DidUpdateGeometry()
+    DidUpdateGeometry(WebCore::IntSize newIntrinsicContentSize)
+    IntrinsicContentSizeDidChange(WebCore::IntSize newIntrinsicContentSize)
 #endif
 }

Modified: trunk/Source/WebKit2/UIProcess/PageClient.h (136177 => 136178)


--- trunk/Source/WebKit2/UIProcess/PageClient.h	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/UIProcess/PageClient.h	2012-11-30 00:01:59 UTC (rev 136178)
@@ -225,6 +225,7 @@
 
 #if USE(APPKIT)
     virtual WKView* wkView() const = 0;
+    virtual void intrinsicContentSizeDidChange(const WebCore::IntSize& intrinsicContentSize) = 0;
 #if USE(DICTATION_ALTERNATIVES)
     virtual uint64_t addDictationAlternatives(const RetainPtr<NSTextAlternatives>&) = 0;
     virtual void removeDictationAlternatives(uint64_t dictationContext) = 0;

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (136177 => 136178)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2012-11-30 00:01:59 UTC (rev 136178)
@@ -233,6 +233,7 @@
     , m_renderTreeSize(0)
     , m_shouldSendEventsSynchronously(false)
     , m_suppressVisibilityUpdates(false)
+    , m_minimumLayoutWidth(0)
     , m_mediaVolume(1)
     , m_mayStartMediaWhenInWindow(true)
 #if ENABLE(PAGE_VISIBILITY_API)
@@ -4129,8 +4130,22 @@
     m_process->send(Messages::WebPage::LinkClicked(url, event), m_pageID, 0);
 }
 
+void WebPageProxy::setMinimumLayoutWidth(double minimumLayoutWidth)
+{
+    if (m_minimumLayoutWidth == minimumLayoutWidth)
+        return;
+
+    m_minimumLayoutWidth = minimumLayoutWidth;
+    m_drawingArea->minimumLayoutWidthDidChange();
+
 #if PLATFORM(MAC)
+    if (m_minimumLayoutWidth <= 0)
+        intrinsicContentSizeDidChange(IntSize(-1, -1));
+#endif
+}
 
+#if PLATFORM(MAC)
+
 void WebPageProxy::substitutionsPanelIsShowing(bool& isShowing)
 {
     isShowing = TextChecker::substitutionsPanelIsShowing();

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (136177 => 136178)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2012-11-30 00:01:59 UTC (rev 136178)
@@ -409,6 +409,7 @@
 
 #if USE(APPKIT)
     WKView* wkView() const;
+    void intrinsicContentSizeDidChange(const WebCore::IntSize& intrinsicContentSize);
 #endif
 #endif
 #if PLATFORM(WIN)
@@ -757,6 +758,9 @@
 
     const WebLoaderClient& loaderClient() { return m_loaderClient; }
 
+    double minimumLayoutWidth() const { return m_minimumLayoutWidth; }
+    void setMinimumLayoutWidth(double);
+
 private:
     WebPageProxy(PageClient*, PassRefPtr<WebProcessProxy>, WebPageGroup*, uint64_t pageID);
 
@@ -1242,6 +1246,7 @@
     bool m_shouldSendEventsSynchronously;
 
     bool m_suppressVisibilityUpdates;
+    float m_minimumLayoutWidth;
 
     float m_mediaVolume;
     bool m_mayStartMediaWhenInWindow;

Modified: trunk/Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h (136177 => 136178)


--- trunk/Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h	2012-11-30 00:01:59 UTC (rev 136178)
@@ -48,13 +48,15 @@
     virtual void sizeDidChange() OVERRIDE;
     virtual void waitForPossibleGeometryUpdate() OVERRIDE;
     virtual void colorSpaceDidChange() OVERRIDE;
+    virtual void minimumLayoutWidthDidChange() OVERRIDE;
 
     virtual void enterAcceleratedCompositingMode(uint64_t backingStoreStateID, const LayerTreeContext&) OVERRIDE;
     virtual void exitAcceleratedCompositingMode(uint64_t backingStoreStateID, const UpdateInfo&) OVERRIDE;
     virtual void updateAcceleratedCompositingMode(uint64_t backingStoreStateID, const LayerTreeContext&) OVERRIDE;
 
     // Message handlers.
-    virtual void didUpdateGeometry() OVERRIDE;
+    virtual void didUpdateGeometry(const WebCore::IntSize& newIntrinsicContentSize) OVERRIDE;
+    virtual void intrinsicContentSizeDidChange(const WebCore::IntSize& newIntrinsicContentSize) OVERRIDE;
 
     void sendUpdateGeometry();
 
@@ -63,6 +65,9 @@
 
     // The last size we sent to the web process.
     WebCore::IntSize m_lastSentSize;
+
+    // The last minimum layout width we sent to the web process.
+    double m_lastSentMinimumLayoutWidth;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm (136177 => 136178)


--- trunk/Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm	2012-11-30 00:01:59 UTC (rev 136178)
@@ -47,6 +47,7 @@
 TiledCoreAnimationDrawingAreaProxy::TiledCoreAnimationDrawingAreaProxy(WebPageProxy* webPageProxy)
     : DrawingAreaProxy(DrawingAreaTypeTiledCoreAnimation, webPageProxy)
     , m_isWaitingForDidUpdateGeometry(false)
+    , m_lastSentMinimumLayoutWidth(0)
 {
 }
 
@@ -103,6 +104,19 @@
     m_webPageProxy->process()->send(Messages::DrawingArea::SetColorSpace(m_webPageProxy->colorSpace()), m_webPageProxy->pageID());
 }
 
+void TiledCoreAnimationDrawingAreaProxy::minimumLayoutWidthDidChange()
+{
+    if (!m_webPageProxy->isValid())
+        return;
+
+    // We only want one UpdateGeometry message in flight at once, so if we've already sent one but
+    // haven't yet received the reply we'll just return early here.
+    if (m_isWaitingForDidUpdateGeometry)
+        return;
+
+    sendUpdateGeometry();
+}
+
 void TiledCoreAnimationDrawingAreaProxy::enterAcceleratedCompositingMode(uint64_t backingStoreStateID, const LayerTreeContext& layerTreeContext)
 {
     m_webPageProxy->enterAcceleratedCompositingMode(layerTreeContext);
@@ -119,24 +133,36 @@
     m_webPageProxy->updateAcceleratedCompositingMode(layerTreeContext);
 }
 
-void TiledCoreAnimationDrawingAreaProxy::didUpdateGeometry()
+void TiledCoreAnimationDrawingAreaProxy::didUpdateGeometry(const IntSize& newIntrinsicContentSize)
 {
     ASSERT(m_isWaitingForDidUpdateGeometry);
 
     m_isWaitingForDidUpdateGeometry = false;
 
+    double minimumLayoutWidth = m_webPageProxy->minimumLayoutWidth();
+
     // If the WKView was resized while we were waiting for a DidUpdateGeometry reply from the web process,
     // we need to resend the new size here.
-    if (m_lastSentSize != m_size)
+    if (m_lastSentSize != m_size || m_lastSentMinimumLayoutWidth != minimumLayoutWidth)
         sendUpdateGeometry();
+
+    if (minimumLayoutWidth > 0)
+        m_webPageProxy->intrinsicContentSizeDidChange(newIntrinsicContentSize);
 }
 
+void TiledCoreAnimationDrawingAreaProxy::intrinsicContentSizeDidChange(const IntSize& newIntrinsicContentSize)
+{
+    if (m_webPageProxy->minimumLayoutWidth() > 0)
+        m_webPageProxy->intrinsicContentSizeDidChange(newIntrinsicContentSize);
+}
+
 void TiledCoreAnimationDrawingAreaProxy::sendUpdateGeometry()
 {
     ASSERT(!m_isWaitingForDidUpdateGeometry);
 
+    m_lastSentMinimumLayoutWidth = m_webPageProxy->minimumLayoutWidth();
     m_lastSentSize = m_size;
-    m_webPageProxy->process()->send(Messages::DrawingArea::UpdateGeometry(m_size), m_webPageProxy->pageID());
+    m_webPageProxy->process()->send(Messages::DrawingArea::UpdateGeometry(m_size, m_lastSentMinimumLayoutWidth), m_webPageProxy->pageID());
     m_isWaitingForDidUpdateGeometry = true;
 }
 

Modified: trunk/Source/WebKit2/UIProcess/mac/WebPageProxyMac.mm (136177 => 136178)


--- trunk/Source/WebKit2/UIProcess/mac/WebPageProxyMac.mm	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/UIProcess/mac/WebPageProxyMac.mm	2012-11-30 00:01:59 UTC (rev 136178)
@@ -474,6 +474,11 @@
     return m_pageClient->wkView();
 }
 
+void WebPageProxy::intrinsicContentSizeDidChange(const IntSize& intrinsicContentSize)
+{
+    m_pageClient->intrinsicContentSizeDidChange(intrinsicContentSize);
+}
+
 void WebPageProxy::setAcceleratedCompositingRootLayer(const GraphicsLayer* rootLayer)
 {
     m_pageClient->setAcceleratedCompositingRootLayer(rootLayer->platformLayer());

Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp (136177 => 136178)


--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp	2012-11-30 00:01:59 UTC (rev 136178)
@@ -432,7 +432,7 @@
     return 0;
 }
 
-void WebChromeClient::contentsSizeChanged(Frame* frame, const IntSize& /*size*/) const
+void WebChromeClient::contentsSizeChanged(Frame* frame, const IntSize& size) const
 {
     if (!m_page->corePage()->settings()->frameFlatteningEnabled()) {
         WebFrame* largestFrame = findLargestFrameInFrameSet(m_page);
@@ -456,6 +456,8 @@
 
 #endif
 
+    m_page->drawingArea()->mainFrameContentSizeChanged(size);
+
     FrameView* frameView = frame->view();
     if (frameView && !frameView->delegatesScrolling())  {
         bool hasHorizontalScrollbar = frameView->horizontalScrollbar();

Modified: trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.h (136177 => 136178)


--- trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.h	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.h	2012-11-30 00:01:59 UTC (rev 136178)
@@ -86,6 +86,7 @@
 
     virtual void setPaintingEnabled(bool) { }
     virtual void updatePreferences(const WebPreferencesStore&) { }
+    virtual void mainFrameContentSizeChanged(const WebCore::IntSize&) { }
 
 #if USE(ACCELERATED_COMPOSITING)
     virtual WebCore::GraphicsLayerFactory* graphicsLayerFactory() { return 0; }
@@ -121,7 +122,7 @@
 
 #if PLATFORM(MAC)
     // Used by TiledCoreAnimationDrawingArea.
-    virtual void updateGeometry(const WebCore::IntSize& viewSize) { }
+    virtual void updateGeometry(const WebCore::IntSize& viewSize, double minimumLayoutWidth) { }
     virtual void setDeviceScaleFactor(float) { }
     virtual void setColorSpace(const ColorSpaceData&) { }
 #endif

Modified: trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.messages.in (136177 => 136178)


--- trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.messages.in	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.messages.in	2012-11-30 00:01:59 UTC (rev 136178)
@@ -30,7 +30,7 @@
 
 #if PLATFORM(MAC)
     // Used by TiledCoreAnimationDrawingArea.
-    UpdateGeometry(WebCore::IntSize viewSize)
+    UpdateGeometry(WebCore::IntSize viewSize, double minimumLayoutWidth)
     SetDeviceScaleFactor(float deviceScaleFactor)
     SetColorSpace(WebKit::ColorSpaceData colorSpace)
 #endif

Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h (136177 => 136178)


--- trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h	2012-11-30 00:01:59 UTC (rev 136178)
@@ -65,6 +65,7 @@
     virtual void didUninstallPageOverlay() OVERRIDE;
     virtual void setPageOverlayNeedsDisplay(const WebCore::IntRect&) OVERRIDE;
     virtual void updatePreferences(const WebPreferencesStore&) OVERRIDE;
+    virtual void mainFrameContentSizeChanged(const WebCore::IntSize&) OVERRIDE;
 
     virtual void dispatchAfterEnsuringUpdatedScrollPosition(const Function<void ()>&) OVERRIDE;
 
@@ -80,7 +81,7 @@
     // Message handlers.
     virtual void suspendPainting() OVERRIDE;
     virtual void resumePainting() OVERRIDE;
-    virtual void updateGeometry(const WebCore::IntSize& viewSize) OVERRIDE;
+    virtual void updateGeometry(const WebCore::IntSize& viewSize, double minimumLayoutWidth) OVERRIDE;
     virtual void setDeviceScaleFactor(float) OVERRIDE;
     virtual void setLayerHostingMode(uint32_t) OVERRIDE;
     virtual void setColorSpace(const ColorSpaceData&) OVERRIDE;
@@ -105,6 +106,10 @@
     OwnPtr<WebCore::GraphicsLayer> m_pageOverlayLayer;
 
     bool m_isPaintingSuspended;
+
+    double m_minimumLayoutWidth;
+    WebCore::IntSize m_lastSentIntrinsicContentSize;
+    bool m_inUpdateGeometry;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm (136177 => 136178)


--- trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm	2012-11-29 23:40:23 UTC (rev 136177)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm	2012-11-30 00:01:59 UTC (rev 136178)
@@ -33,6 +33,7 @@
 #import "EventDispatcher.h"
 #import "LayerHostingContext.h"
 #import "LayerTreeContext.h"
+#import "WebFrame.h"
 #import "WebPage.h"
 #import "WebPageCreationParameters.h"
 #import "WebPageProxyMessages.h"
@@ -69,6 +70,7 @@
     , m_layerTreeStateIsFrozen(false)
     , m_layerFlushScheduler(this)
     , m_isPaintingSuspended(!parameters.isVisible)
+    , m_minimumLayoutWidth(0)
 {
     Page* page = m_webPage->corePage();
 
@@ -229,6 +231,21 @@
     ScrollingThread::dispatch(bind(&ScrollingTree::setDebugRootLayer, m_webPage->corePage()->scrollingCoordinator()->scrollingTree(), m_debugInfoLayer));
 }
 
+void TiledCoreAnimationDrawingArea::mainFrameContentSizeChanged(const IntSize& contentSize)
+{
+    if (!m_minimumLayoutWidth)
+        return;
+
+    if (m_inUpdateGeometry)
+        return;
+
+    if (m_lastSentIntrinsicContentSize == contentSize)
+        return;
+
+    m_lastSentIntrinsicContentSize = contentSize;
+    m_webPage->send(Messages::DrawingAreaProxy::IntrinsicContentSizeDidChange(contentSize));
+}
+
 void TiledCoreAnimationDrawingArea::dispatchAfterEnsuringUpdatedScrollPosition(const Function<void ()>& functionRef)
 {
     m_webPage->ref();
@@ -330,9 +347,24 @@
         m_webPage->corePage()->resumeScriptedAnimations();
 }
 
-void TiledCoreAnimationDrawingArea::updateGeometry(const IntSize& viewSize)
+void TiledCoreAnimationDrawingArea::updateGeometry(const IntSize& viewSize, double minimumLayoutWidth)
 {
-    m_webPage->setSize(viewSize);
+    m_inUpdateGeometry = true;
+
+    m_minimumLayoutWidth = minimumLayoutWidth;
+
+    IntSize size = viewSize;
+    IntSize contentSize = IntSize(-1, -1);
+
+    if (m_minimumLayoutWidth > 0) {
+        m_webPage->setSize(IntSize(m_minimumLayoutWidth, 0));
+        m_webPage->layoutIfNeeded();
+
+        contentSize = m_webPage->mainWebFrame()->contentBounds().size();
+        size = contentSize;
+    }
+
+    m_webPage->setSize(size);
     m_webPage->layoutIfNeeded();
 
     if (m_pageOverlayLayer)
@@ -351,7 +383,10 @@
     [CATransaction flush];
     [CATransaction synchronize];
 
-    m_webPage->send(Messages::DrawingAreaProxy::DidUpdateGeometry());
+    m_lastSentIntrinsicContentSize = contentSize;
+    m_webPage->send(Messages::DrawingAreaProxy::DidUpdateGeometry(contentSize));
+
+    m_inUpdateGeometry = false;
 }
 
 void TiledCoreAnimationDrawingArea::setDeviceScaleFactor(float deviceScaleFactor)
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to