CSS JIT: Apply backtracking optimization to adjacent backtracking
https://bugs.webkit.org/show_bug.cgi?id=132951

Patch by Yusuke Suzuki <utatane.tea@gmail.com> on 2014-05-23
Reviewed by Benjamin Poulain.

Apply the backtracking optimization to the adjacent backtracking.
This optimization is already done for the descendant backtracking.
We apply this to the adjacent backtracking similarly.

Source/WebCore:
Test: fast/selectors/backtracking-adjacent-optimized.html

* cssjit/SelectorCompiler.cpp:
(WebCore::SelectorCompiler::SelectorFragment::SelectorFragment):
(WebCore::SelectorCompiler::solveAdjacentBacktrackingActionForDirectAdjacent):
(WebCore::SelectorCompiler::solveBacktrackingAction):
(WebCore::SelectorCompiler::computeBacktrackingStartOffsetInChain):
(WebCore::SelectorCompiler::computeBacktrackingHeightFromDescendant):
(WebCore::SelectorCompiler::computeBacktrackingWidthFromIndirectAdjacent):
(WebCore::SelectorCompiler::SelectorCodeGenerator::computeBacktrackingInformation):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateIndirectAdjacentTreeWalker):
(WebCore::SelectorCompiler::SelectorCodeGenerator::linkFailures):
(WebCore::SelectorCompiler::computeBacktrackingStartHeightFromDescendant): Deleted.

LayoutTests:
* fast/selectors/backtracking-adjacent-optimized-expected.txt: Added.
* fast/selectors/backtracking-adjacent-optimized.html: Added.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@169298 268f45cc-cd09-0410-ab3c-d52691b4dbfc
REGRESSION (iOS WebKit2): requestAnimationFrame fires more than once between layer tree commits
https://bugs.webkit.org/show_bug.cgi?id=132794
<rdar://problem/16877909>

Reviewed by Simon Fraser.

Virtualize DisplayRefreshMonitor so that WebKit2 can implement its own DisplayRefreshMonitor for UI-side compositing views.
This allows the synchronization of requestAnimationFrame callbacks with UI-side compositing painting.

* WebCore.exp.in:
* WebCore.xcodeproj/project.pbxproj:

* page/ChromeClient.h:
(WebCore::ChromeClient::graphicsLayerFactory):
(WebCore::ChromeClient::createDisplayRefreshMonitor):
* platform/graphics/DisplayRefreshMonitorFactory.h: Added.
* platform/graphics/GraphicsLayerUpdater.cpp:
(WebCore::GraphicsLayerUpdater::createDisplayRefreshMonitor):
* platform/graphics/GraphicsLayerUpdater.h:
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::createDisplayRefreshMonitor):
* rendering/RenderLayerCompositor.h:
Give the ChromeClient a chance to provide us with a custom DisplayRefreshMonitor.
If it does not, we'll fall back to making a DisplayRefreshMonitorMac or
DisplayRefreshMonitorIOS depending on the platform.

* dom/ScriptedAnimationController.cpp:
* dom/ScriptedAnimationController.h:
* platform/graphics/DisplayRefreshMonitor.cpp:
* platform/graphics/DisplayRefreshMonitor.h:
* platform/graphics/DisplayRefreshMonitorClient.cpp: Added.
* platform/graphics/DisplayRefreshMonitorClient.h: Added.
* platform/graphics/DisplayRefreshMonitorManager.cpp: Added.
* platform/graphics/DisplayRefreshMonitorManager.h: Added.
Split DisplayRefreshMonitor.cpp into one file per class.
Use references in a few places.
Remove some useless comments.

* platform/graphics/DisplayRefreshMonitor.cpp:
(WebCore::DisplayRefreshMonitor::displayDidRefresh):
Use takeAny() and remove a FIXME about it not existing.

* platform/graphics/DisplayRefreshMonitorClient.cpp: Added.
(WebCore::DisplayRefreshMonitorClient::fireDisplayRefreshIfNeeded):
Use an early return instead of having the whole function body in an if().

* platform/graphics/ios/DisplayRefreshMonitorIOS.h: Added.
* platform/graphics/ios/DisplayRefreshMonitorIOS.mm:
* platform/graphics/mac/DisplayRefreshMonitorMac.cpp:
* platform/graphics/mac/DisplayRefreshMonitorMac.h: Added.
Virtualize DisplayRefreshMonitorIOS and DisplayRefreshMonitorMac,
and move things specific to each of them out of DisplayRefreshMonitor itself.

* WebKit2.xcodeproj/project.pbxproj:
* WebProcess/WebCoreSupport/WebChromeClient.cpp:
(WebKit::WebChromeClient::createDisplayRefreshMonitor):
* WebProcess/WebCoreSupport/WebChromeClient.h:
* WebProcess/WebPage/DrawingArea.h:
(WebKit::DrawingArea::graphicsLayerFactory):
(WebKit::DrawingArea::createDisplayRefreshMonitor):
Plumb the DisplayRefreshMonitor request through to the DrawingArea.
RemoteLayerTreeDrawingArea will implement and return a RemoteLayerTreeDisplayRefreshMonitor.

* WebProcess/WebPage/Cocoa/RemoteLayerTreeDisplayRefreshMonitor.h: Added.
(WebKit::RemoteLayerTreeDisplayRefreshMonitor::create):
* WebProcess/WebPage/Cocoa/RemoteLayerTreeDisplayRefreshMonitor.mm: Added.
(WebKit::RemoteLayerTreeDisplayRefreshMonitor::RemoteLayerTreeDisplayRefreshMonitor):
(WebKit::RemoteLayerTreeDisplayRefreshMonitor::~RemoteLayerTreeDisplayRefreshMonitor):
(WebKit::RemoteLayerTreeDisplayRefreshMonitor::requestRefreshCallback):
When requesting a display refresh callback, schedule a layer commit.
It may end up being empty, but will still call us back with a didUpdate,
upon which we'll fire the callback.

(WebKit::RemoteLayerTreeDisplayRefreshMonitor::didUpdateLayers):

* WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.h:
* WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm:
(WebKit::RemoteLayerTreeDrawingArea::createDisplayRefreshMonitor):
(WebKit::RemoteLayerTreeDrawingArea::willDestroyDisplayRefreshMonitor):
Keep track of the set of DisplayRefreshMonitors.

(WebKit::RemoteLayerTreeDrawingArea::didUpdate):
Fire requestAnimationFrame callbacks once the UI process commits the new layer tree.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@169299 268f45cc-cd09-0410-ab3c-d52691b4dbfc