diff --git a/DEPS b/DEPS
index 217167fe..0b765af 100644
--- a/DEPS
+++ b/DEPS
@@ -36,7 +36,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '6f8411dfa4506564d9886c08cceb154713feb3f8',
+  'skia_revision': 'ec559591ae8f2c7005ad3824b718df5f01747851',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
diff --git a/build/config/ios/rules.gni b/build/config/ios/rules.gni
index d3afc12..ca71a274 100644
--- a/build/config/ios/rules.gni
+++ b/build/config/ios/rules.gni
@@ -194,10 +194,11 @@
                              "*",
                              [
                                "bundle_deps",
+                               "bundle_deps_filter",
                                "bundle_extension",
-                               "extra_system_frameworks",
                                "entitlements_path",
                                "extra_substitutions",
+                               "extra_system_frameworks",
                                "info_plist",
                                "info_plist_target",
                                "output_name",
@@ -321,11 +322,12 @@
                              "*",
                              [
                                "bundle_deps",
+                               "bundle_deps_filter",
                                "bundle_extension",
-                               "extra_system_frameworks",
                                "data_deps",
                                "entitlements_path",
                                "extra_substitutions",
+                               "extra_system_frameworks",
                                "info_plist",
                                "info_plist_target",
                                "output_name",
@@ -471,6 +473,7 @@
     create_bundle(target_name) {
       forward_variables_from(invoker,
                              [
+                               "bundle_deps_filter",
                                "data_deps",
                                "deps",
                                "public_deps",
@@ -593,6 +596,9 @@
   if (defined(invoker.bundle_deps)) {
     assert(invoker.bundle_deps != [], "mark bundle_deps as used")
   }
+  if (defined(invoker.bundle_deps_filter)) {
+    assert(invoker.bundle_deps_filter != [], "mark bundle_deps_filter as used")
+  }
 }
 
 set_defaults("ios_app_bundle") {
diff --git a/chrome/VERSION b/chrome/VERSION
index 1c44b7cf..1f31d15 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=54
 MINOR=0
-BUILD=2822
+BUILD=2823
 PATCH=0
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 577f33ac..42dc3c4 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-8673.0.0
\ No newline at end of file
+8680.0.0
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/LeakExpectations b/third_party/WebKit/LayoutTests/LeakExpectations
index 0cca4cf..7649d987 100644
--- a/third_party/WebKit/LayoutTests/LeakExpectations
+++ b/third_party/WebKit/LayoutTests/LeakExpectations
@@ -106,3 +106,13 @@
 crbug.com/594309 [ Linux ] imported/csswg-test/vendor-imports/mozilla/mozilla-central-reftests/variables/variable-external-font-face-01.html [ Pass Leak ]
 crbug.com/594309 [ Linux ] imported/csswg-test/vendor-imports/mozilla/mozilla-central-reftests/variables/variable-font-face-02.html [ Pass Leak ]
 crbug.com/594309 [ Linux ] imported/csswg-test/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-007.html [ Leak ]
+
+# These fail in the leak detector: http://crbug.com/612924#c4
+crbug.com/619060 [ Linux ] imported/wpt/pointerevents/pointerevent_change-touch-action-onpointerdown_touch-manual.html [ Leak ]
+crbug.com/619060 [ Linux ] imported/wpt/pointerevents/pointerevent_pointerout_after_pointercancel_touch-manual.html [ Leak ]
+crbug.com/619060 [ Linux ] imported/wpt/pointerevents/pointerevent_touch-action-auto-css_touch-manual.html  [ Leak ]
+crbug.com/619060 [ Linux ] imported/wpt/pointerevents/pointerevent_releasepointercapture_onpointercancel_touch-manual.html [ Leak ]
+crbug.com/619060 [ Linux ] imported/wpt/pointerevents/pointerevent_touch-action-pan-x-pan-y_touch-manual.html  [ Leak ]
+crbug.com/619060 [ Linux ] imported/wpt/pointerevents/pointerevent_touch-action-inherit_highest-parent-none_touch-manual.html  [ Leak ]
+crbug.com/619060 [ Linux ] imported/wpt/pointerevents/pointerevent_pointercancel_touch-manual.html  [ Leak ]
+crbug.com/619060 [ Linux ] imported/wpt/pointerevents/pointerevent_pointerleave_after_pointercancel_touch-manual.html  [ Leak ]
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 2075a5eb..fb4f390 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -887,59 +887,47 @@
 crbug.com/630671 imported/wpt/pointerevents/pointerevent_releasepointercapture_events_to_original_target-manual.html [ Skip ]
 crbug.com/630671 imported/wpt/pointerevents/pointerevent_setpointercapture_relatedtarget-manual.html [ Skip ]
 
-# These fail in the leak detector: http://crbug.com/612924#c4
-crbug.com/619060 [ Linux ] imported/wpt/pointerevents/pointerevent_change-touch-action-onpointerdown_touch-manual.html [ Skip ]
-crbug.com/619060 [ Linux ] imported/wpt/pointerevents/pointerevent_pointerout_after_pointercancel_touch-manual.html [ Skip ]
-crbug.com/619060 [ Linux ] imported/wpt/pointerevents/pointerevent_touch-action-auto-css_touch-manual.html  [ Skip ]
-crbug.com/619060 [ Linux ] imported/wpt/pointerevents/pointerevent_releasepointercapture_onpointercancel_touch-manual.html [ Skip ]
-crbug.com/619060 [ Linux ] imported/wpt/pointerevents/pointerevent_touch-action-pan-x-pan-y_touch-manual.html  [ Skip ]
-
 # The commented lines here for Mac is due to the fact that there is a more
 # generic skip rule in the next block of rules. However, when they get fixed
 # these should be uncommented as there is no touch support on Mac.
 crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_change-touch-action-onpointerdown_touch-manual.html [ Skip ]
-# crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_pointerenter_nohover-manual.html [ Skip ]
-# crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_pointerleave_after_pointerup_nohover-manual.html [ Skip ]
-# crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_pointerleave_after_pointercancel_touch-manual.html [ Skip ]
-# crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_pointercancel_touch-manual.html [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_pointerenter_nohover-manual.html [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_pointerleave_after_pointerup_nohover-manual.html [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_pointerleave_after_pointercancel_touch-manual.html [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_pointercancel_touch-manual.html [ Skip ]
 crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_pointerout_after_pointerup_nohover-manual.html [ Skip ]
 crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_pointertype_touch-manual.html [ Skip ]
 crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_releasepointercapture_onpointercancel_touch-manual.html [ Skip ]
 crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_pointerout_after_pointercancel_touch-manual.html [ Skip ]
-# crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_pointerleave_touch-manual.html [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_pointerleave_touch-manual.html [ Skip ]
 crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_touch-action-auto-css_touch-manual.html  [ Skip ]
 crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_touch-action-pan-x-pan-y_touch-manual.html  [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_touch-action-pan-x-css_touch-manual.html  [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_touch-action-button-test_touch-manual.html  [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_touch-action-table-test_touch-manual.html  [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_touch-action-pan-x-pan-y-pan-y_touch-manual.html  [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_touch-action-pan-y-css_touch-manual.html  [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_touch-action-inherit_highest-parent-none_touch-manual.html  [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_touch-action-span-test_touch-manual.html  [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_touch-action-svg-test_touch-manual.html  [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-x_touch-manual.html  [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_touch-action-none-css_touch-manual.html  [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_touch-action-inherit_parent-none_touch-manual.html  [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_touch-action-inherit_child-none_touch-manual.html  [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-y_touch-manual.html  [ Skip ]
+crbug.com/613672 [ Mac ] imported/wpt/pointerevents/pointerevent_touch-action-inherit_child-auto-child-none_touch-manual.html  [ Skip ]
 
-# These are crashing on Linux debug builds and timing out on Mac as it doesn't support touch
-crbug.com/619060 imported/wpt/pointerevents/pointerevent_lostpointercapture_for_disconnected_node-manual.html  [ Skip ]
-crbug.com/619060 imported/wpt/pointerevents/pointerevent_lostpointercapture_is_first-manual.html  [ Skip ]
-crbug.com/619060 imported/wpt/pointerevents/pointerevent_pointercancel_touch-manual.html  [ Skip ]
-crbug.com/619060 imported/wpt/pointerevents/pointerevent_pointerenter_nohover-manual.html  [ Skip ]
-crbug.com/619060 imported/wpt/pointerevents/pointerevent_pointerleave_after_pointercancel_touch-manual.html  [ Skip ]
-crbug.com/619060 imported/wpt/pointerevents/pointerevent_pointerleave_after_pointerup_nohover-manual.html  [ Skip ]
-crbug.com/619060 imported/wpt/pointerevents/pointerevent_pointerleave_touch-manual.html  [ Skip ]
+# These are errors even when running the tests manually.
+crbug.com/629722 imported/wpt/pointerevents/pointerevent_lostpointercapture_is_first-manual.html  [ Skip ]
+crbug.com/629722 imported/wpt/pointerevents/pointerevent_lostpointercapture_for_disconnected_node-manual.html  [ Skip ]
 
-crbug.com/627341 imported/wpt/pointerevents/pointerevent_suppress_compat_events_on_click.html [ Skip ]
-crbug.com/627341 imported/wpt/pointerevents/pointerevent_suppress_compat_events_on_drag_mouse.html [ Skip ]
-crbug.com/627341 imported/wpt/pointerevents/pointerevent_touch-action-inherit_child-auto-child-none_touch-manual.html  [ Skip ]
-crbug.com/627341 imported/wpt/pointerevents/pointerevent_touch-action-inherit_child-none_touch-manual.html  [ Skip ]
-crbug.com/627341 imported/wpt/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-x_touch-manual.html  [ Skip ]
-crbug.com/627341 imported/wpt/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-y_touch-manual.html  [ Skip ]
-crbug.com/627341 imported/wpt/pointerevents/pointerevent_touch-action-inherit_highest-parent-none_touch-manual.html  [ Skip ]
-crbug.com/627341 imported/wpt/pointerevents/pointerevent_touch-action-inherit_parent-none_touch-manual.html  [ Skip ]
-crbug.com/627341 imported/wpt/pointerevents/pointerevent_touch-action-keyboard-manual.html  [ Skip ]
-crbug.com/627341 imported/wpt/pointerevents/pointerevent_touch-action-none-css_touch-manual.html  [ Skip ]
-crbug.com/627341 imported/wpt/pointerevents/pointerevent_touch-action-pan-x-css_touch-manual.html  [ Skip ]
-crbug.com/627341 imported/wpt/pointerevents/pointerevent_touch-action-pan-x-pan-y-pan-y_touch-manual.html  [ Skip ]
-crbug.com/627341 imported/wpt/pointerevents/pointerevent_touch-action-pan-y-css_touch-manual.html  [ Skip ]
-crbug.com/627341 imported/wpt/pointerevents/pointerevent_touch-action-span-test_touch-manual.html  [ Skip ]
-crbug.com/627341 imported/wpt/pointerevents/pointerevent_touch-action-svg-test_touch-manual.html  [ Skip ]
-crbug.com/627341 imported/wpt/pointerevents/pointerevent_touch-action-table-test_touch-manual.html  [ Skip ]
+# There is no assoicated JS file to support automated user inputs.
+crbug.com/629724 imported/wpt/pointerevents/pointerevent_suppress_compat_events_on_click.html [ Skip ]
+crbug.com/629724 imported/wpt/pointerevents/pointerevent_suppress_compat_events_on_drag_mouse.html [ Skip ]
 
+# We should send PointerLeave events for stylus devices.
 crbug.com/583413 imported/wpt/pointerevents/pointerevent_pointerleave_pen-manual.html  [ Failure ]
 
-crbug.com/627716 imported/wpt/pointerevents/pointerevent_touch-action-button-test_touch-manual.html [ Skip ]
-
 # These testcases are incorrect, mark them as failing until they're fixed in the testsuite.
 # https://lists.w3.org/Archives/Public/www-style/2016Jan/0275.html
 # https://lists.w3.org/Archives/Public/www-style/2016Jan/0276.html
diff --git a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_change-touch-action-onpointerdown_touch-manual-automation.js b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_change-touch-action-onpointerdown_touch-manual-automation.js
index c703dda..904f62ba 100644
--- a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_change-touch-action-onpointerdown_touch-manual-automation.js
+++ b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_change-touch-action-onpointerdown_touch-manual-automation.js
@@ -1,2 +1,2 @@
 if (window.chrome && chrome.gpuBenchmarking)
-  chrome.gpuBenchmarking.smoothDrag(250, 250, 200, 200, function() {}, 1);
+  chrome.gpuBenchmarking.smoothScrollBy(50, function() {}, 250, 250, 1, "down");
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_common_input.js b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_common_input.js
index 9c23f18..f5282e15 100644
--- a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_common_input.js
+++ b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_common_input.js
@@ -55,33 +55,71 @@
 }
 
 // Touch actions
+const scrollOffset = 30;
+const boundaryOffset = 5;
+const touchSourceType = 1;
 function touchTapInTarget(targetId) {
   if (window.chrome && chrome.gpuBenchmarking) {
     var target = document.getElementById(targetId);
+    target.scrollIntoViewIfNeeded();
     var targetRect = target.getBoundingClientRect();
-    window.scrollTo(targetRect.left, targetRect.top);
+    chrome.gpuBenchmarking.tap(targetRect.left+boundaryOffset, targetRect.top+boundaryOffset);
+  }
+}
+
+function scrollPageIfNeeded(targetRect, startX, startY) {
+  if (startY > window.innerHeight) {
+    window.scrollTo(0, targetRect.top);
+  }
+  if (startX > window.innerWidth) {
+    window.scrollTo(targetRect.left, 0);
+  }
+}
+
+// TODO(nzolghadr): these two functions can be removed if we know the ID of the elements where we want to touch, see https://crbug.com/633672.
+function touchSmoothScrollUp(target) {
+  if (window.chrome && chrome.gpuBenchmarking) {
+    var targetRect = target.getBoundingClientRect();
+    var startX = targetRect.left+targetRect.width/2;
+    var startY = targetRect.top+targetRect.height/2;
+    scrollPageIfNeeded(targetRect, startX, startY);
     targetRect = target.getBoundingClientRect();
-    chrome.gpuBenchmarking.tap(targetRect.left+5, targetRect.top+5);
+    startX = targetRect.left+targetRect.width/2;
+    startY = targetRect.top+targetRect.height/2;
+    chrome.gpuBenchmarking.smoothScrollBy(scrollOffset, function() {}, startX, startY, touchSourceType, "down");
+  }
+}
+
+function touchSmoothScrollLeft(target, callback_func) {
+  if (window.chrome && chrome.gpuBenchmarking) {
+    var targetRect = target.getBoundingClientRect();
+    var startX = targetRect.left+targetRect.width/2;
+    var startY = targetRect.top+targetRect.height/2;
+    scrollPageIfNeeded(targetRect, startX, startY);
+    targetRect = target.getBoundingClientRect();
+    startX = targetRect.left+targetRect.width/2;
+    startY = targetRect.top+targetRect.height/2;
+    chrome.gpuBenchmarking.smoothScrollBy(scrollOffset, callback_func, startX, startY, touchSourceType, "right");
   }
 }
 
 function touchScrollUpInTarget(targetId) {
   if (window.chrome && chrome.gpuBenchmarking) {
     var target = document.getElementById(targetId);
-    var targetRect = target.getBoundingClientRect();
-    window.scrollTo(targetRect.left, targetRect.top);
-    targetRect = target.getBoundingClientRect();
-    chrome.gpuBenchmarking.smoothDrag(targetRect.left, targetRect.bottom-5, targetRect.left, targetRect.top+5);
+    touchSmoothScrollUp(target);
   }
 }
 
-function touchScrollLeftInTarget(targetId) {
+function touchScrollLeftInTarget(targetId, callback_func) {
   if (window.chrome && chrome.gpuBenchmarking) {
     var target = document.getElementById(targetId);
-    var targetRect = target.getBoundingClientRect();
-    window.scrollTo(targetRect.left, targetRect.top);
-    targetRect = target.getBoundingClientRect();
-    chrome.gpuBenchmarking.smoothDrag(targetRect.right-5, targetRect.top+5, targetRect.left+5, targetRect.top+5);
+    touchSmoothScrollLeft(target, callback_func);
+  }
+}
+
+function touchScrollByPosition(x, y, offset, direction, callback_func) {
+  if (window.chrome && chrome.gpuBenchmarking) {
+    chrome.gpuBenchmarking.smoothScrollBy(offset, callback_func, x, y, 1, direction);
   }
 }
 
@@ -100,12 +138,12 @@
 // Keyboard actions
 function keyboardScrollUp() {
   if (window.eventSender)
-    eventSender.keyDown('downArrow');
+    eventSender.keyDown('ArrowDown');
 }
 
 function keyboardScrollLeft() {
   if (window.eventSender)
-    eventSender.keyDown('rightArrow');
+    eventSender.keyDown('ArrowRight');
 }
 
 // Defined in every test
diff --git a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-button-test_touch-manual-automation.js b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-button-test_touch-manual-automation.js
index d972b5a3..8e6a5db 100644
--- a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-button-test_touch-manual-automation.js
+++ b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-button-test_touch-manual-automation.js
@@ -1,8 +1,24 @@
 importAutomationScript('/pointerevents/pointerevent_common_input.js');
 
-function inject_input() {
-  touchScrollUpInTarget('target0');
-  touchScrollLeftInTarget('target0');
-  touchTapInTarget('btnComplete');
+function callback_function() {
+  window.setTimeout(function() {
+    touchTapInTarget('btnComplete');}
+    , scrollReturnInterval);
 }
 
+function inject_input() {
+   var target = document.getElementById("target0");
+   var targetRect = target.getBoundingClientRect();
+
+   var button = document.getElementsByTagName("button")[0];
+   var buttonRect = button.getBoundingClientRect();
+
+   var x = (buttonRect.left - targetRect.left)/2;
+   touchScrollByPosition(x, targetRect.top + 100, 30, "down");
+   touchScrollByPosition(x, targetRect.top + 100, 30, "right", callback_function);
+
+   window.setTimeout(function() {
+    touchSmoothScrollUp(button);
+    touchSmoothScrollLeft(button, callback_function);
+    } , 4*scrollReturnInterval);
+}
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-inherit_child-auto-child-none_touch-manual-automation.js b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-inherit_child-auto-child-none_touch-manual-automation.js
index d972b5a3..d672827 100644
--- a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-inherit_child-auto-child-none_touch-manual-automation.js
+++ b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-inherit_child-auto-child-none_touch-manual-automation.js
@@ -4,5 +4,4 @@
   touchScrollUpInTarget('target0');
   touchScrollLeftInTarget('target0');
   touchTapInTarget('btnComplete');
-}
-
+}
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-inherit_child-none_touch-manual-automation.js b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-inherit_child-none_touch-manual-automation.js
index d972b5a3..d672827 100644
--- a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-inherit_child-none_touch-manual-automation.js
+++ b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-inherit_child-none_touch-manual-automation.js
@@ -4,5 +4,4 @@
   touchScrollUpInTarget('target0');
   touchScrollLeftInTarget('target0');
   touchTapInTarget('btnComplete');
-}
-
+}
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-x_touch-manual-automation.js b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-x_touch-manual-automation.js
index d972b5a3..a2db6921 100644
--- a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-x_touch-manual-automation.js
+++ b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-x_touch-manual-automation.js
@@ -1,8 +1,10 @@
 importAutomationScript('/pointerevents/pointerevent_common_input.js');
 
-function inject_input() {
-  touchScrollUpInTarget('target0');
-  touchScrollLeftInTarget('target0');
+function callback_function() {
   touchTapInTarget('btnComplete');
 }
 
+function inject_input() {
+  touchScrollUpInTarget('target0');
+  touchScrollLeftInTarget('target0', callback_function);
+}
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-pan-x-pan-y-pan-y_touch-manual-automation.js b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-pan-x-pan-y-pan-y_touch-manual-automation.js
index d972b5a3..a2db6921 100644
--- a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-pan-x-pan-y-pan-y_touch-manual-automation.js
+++ b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-pan-x-pan-y-pan-y_touch-manual-automation.js
@@ -1,8 +1,10 @@
 importAutomationScript('/pointerevents/pointerevent_common_input.js');
 
-function inject_input() {
-  touchScrollUpInTarget('target0');
-  touchScrollLeftInTarget('target0');
+function callback_function() {
   touchTapInTarget('btnComplete');
 }
 
+function inject_input() {
+  touchScrollUpInTarget('target0');
+  touchScrollLeftInTarget('target0', callback_function);
+}
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-pan-x-pan-y_touch-manual-automation.js b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-pan-x-pan-y_touch-manual-automation.js
index 4fffdcf..f1f1dfa1 100644
--- a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-pan-x-pan-y_touch-manual-automation.js
+++ b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-pan-x-pan-y_touch-manual-automation.js
@@ -3,5 +3,4 @@
 function inject_input() {
   touchScrollUpInTarget('target0');
   touchScrollLeftInTarget('target0');
-}
-
+}
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-pan-y-css_touch-manual-automation.js b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-pan-y-css_touch-manual-automation.js
index d972b5a3..d672827 100644
--- a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-pan-y-css_touch-manual-automation.js
+++ b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-pan-y-css_touch-manual-automation.js
@@ -4,5 +4,4 @@
   touchScrollUpInTarget('target0');
   touchScrollLeftInTarget('target0');
   touchTapInTarget('btnComplete');
-}
-
+}
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-span-test_touch-manual-automation.js b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-span-test_touch-manual-automation.js
index d972b5a3..149a1d58 100644
--- a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-span-test_touch-manual-automation.js
+++ b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-span-test_touch-manual-automation.js
@@ -1,8 +1,22 @@
 importAutomationScript('/pointerevents/pointerevent_common_input.js');
 
-function inject_input() {
-  touchScrollUpInTarget('target0');
-  touchScrollLeftInTarget('target0');
+function callback_function() {
   touchTapInTarget('btnComplete');
 }
 
+function inject_input() {
+   var target = document.getElementById("target0");
+   var targetRect = target.getBoundingClientRect();
+
+   var span = document.getElementsByTagName("span")[0];
+   var spanRect = span.getBoundingClientRect();
+
+   var x = (spanRect.left - targetRect.left)/2;
+   touchScrollByPosition(x, targetRect.top + 100, 30, "down");
+   touchScrollByPosition(x, targetRect.top + 100, 30, "right");
+
+   window.setTimeout(function() {
+    touchSmoothScrollUp(span);
+    touchSmoothScrollLeft(span, callback_function);
+    } , 6*scrollReturnInterval);
+}
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-svg-test_touch-manual-automation.js b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-svg-test_touch-manual-automation.js
index d972b5a3..752573d 100644
--- a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-svg-test_touch-manual-automation.js
+++ b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-svg-test_touch-manual-automation.js
@@ -1,8 +1,22 @@
 importAutomationScript('/pointerevents/pointerevent_common_input.js');
 
-function inject_input() {
-  touchScrollUpInTarget('target0');
-  touchScrollLeftInTarget('target0');
+function callback_function() {
   touchTapInTarget('btnComplete');
 }
 
+function inject_input() {
+   var target = document.getElementById("target0");
+   var targetRect = target.getBoundingClientRect();
+
+   var svg = document.getElementsByTagName("svg")[0];
+   var svgRect = svg.getBoundingClientRect();
+
+   var x = (svgRect.left - targetRect.left)/2;
+   touchScrollByPosition(x, targetRect.top + 100, 30, "down");
+   touchScrollByPosition(x, targetRect.top + 100, 30, "right");
+
+   window.setTimeout(function() {
+     touchSmoothScrollUp(svg);
+     touchSmoothScrollLeft(svg, callback_function);
+     } , 4*scrollReturnInterval);
+}
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-table-test_touch-manual-automation.js b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-table-test_touch-manual-automation.js
index d972b5a3..b1d4bb6c 100644
--- a/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-table-test_touch-manual-automation.js
+++ b/third_party/WebKit/LayoutTests/imported/wpt_automation/pointerevents/pointerevent_touch-action-table-test_touch-manual-automation.js
@@ -1,8 +1,22 @@
 importAutomationScript('/pointerevents/pointerevent_common_input.js');
 
-function inject_input() {
-  touchScrollUpInTarget('target0');
-  touchScrollLeftInTarget('target0');
-  touchTapInTarget('btnComplete');
+function callback_function() {
+  window.setTimeout(function() {
+    touchTapInTarget('btnComplete');}
+    , 2 * scrollReturnInterval);
 }
 
+function inject_input() {
+  touchScrollUpInTarget('row1');
+  window.setTimeout(function() {
+    touchScrollLeftInTarget('row1');
+    } , 2*scrollReturnInterval);
+
+  window.setTimeout(function() {
+    touchScrollUpInTarget('cell3');
+    } , 2*scrollReturnInterval);
+
+  window.setTimeout(function() {
+    touchScrollLeftInTarget('cell3', callback_function);
+    } , 2*scrollReturnInterval);
+}
\ No newline at end of file
diff --git a/tools/gn/bundle_data.cc b/tools/gn/bundle_data.cc
index 448eac9..c7f3fb8 100644
--- a/tools/gn/bundle_data.cc
+++ b/tools/gn/bundle_data.cc
@@ -6,6 +6,7 @@
 
 #include "base/logging.h"
 #include "tools/gn/filesystem_utils.h"
+#include "tools/gn/label_pattern.h"
 #include "tools/gn/output_file.h"
 #include "tools/gn/settings.h"
 #include "tools/gn/substitution_writer.h"
@@ -52,6 +53,10 @@
 
 void BundleData::AddBundleData(const Target* target) {
   DCHECK_EQ(target->output_type(), Target::BUNDLE_DATA);
+  for (const auto& pattern : bundle_deps_filter_) {
+    if (pattern.Matches(target->label()))
+      return;
+  }
   bundle_deps_.push_back(target);
 }
 
diff --git a/tools/gn/bundle_data.h b/tools/gn/bundle_data.h
index e35cacb..0281b8b 100644
--- a/tools/gn/bundle_data.h
+++ b/tools/gn/bundle_data.h
@@ -15,6 +15,7 @@
 #include "tools/gn/substitution_list.h"
 #include "tools/gn/unique_vector.h"
 
+class LabelPattern;
 class OutputFile;
 class Settings;
 class Target;
@@ -120,6 +121,13 @@
     return code_signing_args_;
   }
 
+  std::vector<LabelPattern>& bundle_deps_filter() {
+    return bundle_deps_filter_;
+  }
+  const std::vector<LabelPattern>& bundle_deps_filter() const {
+    return bundle_deps_filter_;
+  }
+
   // Recursive collection of all bundle_data that the target depends on.
   const UniqueTargets& bundle_deps() const { return bundle_deps_; }
 
@@ -128,6 +136,7 @@
   std::vector<const Target*> assets_catalog_deps_;
   BundleFileRules file_rules_;
   UniqueTargets bundle_deps_;
+  std::vector<LabelPattern> bundle_deps_filter_;
 
   // All those values are subdirectories relative to root_build_dir, and apart
   // from root_dir, they are either equal to root_dir_ or subdirectories of it.
diff --git a/tools/gn/create_bundle_target_generator.cc b/tools/gn/create_bundle_target_generator.cc
index 99bc4644f..6cbd96fe 100644
--- a/tools/gn/create_bundle_target_generator.cc
+++ b/tools/gn/create_bundle_target_generator.cc
@@ -6,6 +6,7 @@
 
 #include "base/logging.h"
 #include "tools/gn/filesystem_utils.h"
+#include "tools/gn/label_pattern.h"
 #include "tools/gn/parse_tree.h"
 #include "tools/gn/scope.h"
 #include "tools/gn/substitution_type.h"
@@ -54,6 +55,9 @@
 
   if (!FillCodeSigningArgs())
     return;
+
+  if (!FillBundleDepsFilter())
+    return;
 }
 
 bool CreateBundleTargetGenerator::FillBundleDir(
@@ -193,3 +197,24 @@
 
   return target_->bundle_data().code_signing_args().Parse(*value, err_);
 }
+
+bool CreateBundleTargetGenerator::FillBundleDepsFilter() {
+  const Value* value = scope_->GetValue(variables::kBundleDepsFilter, true);
+  if (!value)
+    return true;
+
+  if (!value->VerifyTypeIs(Value::LIST, err_))
+    return false;
+
+  const SourceDir& current_dir = scope_->GetSourceDir();
+  std::vector<LabelPattern>& bundle_deps_filter =
+      target_->bundle_data().bundle_deps_filter();
+  for (const auto& item : value->list_value()) {
+    bundle_deps_filter.push_back(
+        LabelPattern::GetPattern(current_dir, item, err_));
+    if (err_->has_error())
+      return false;
+  }
+
+  return true;
+}
diff --git a/tools/gn/create_bundle_target_generator.h b/tools/gn/create_bundle_target_generator.h
index 9527a1a..585abf1 100644
--- a/tools/gn/create_bundle_target_generator.h
+++ b/tools/gn/create_bundle_target_generator.h
@@ -33,6 +33,7 @@
   bool FillCodeSigningSources();
   bool FillCodeSigningOutputs();
   bool FillCodeSigningArgs();
+  bool FillBundleDepsFilter();
 
   DISALLOW_COPY_AND_ASSIGN(CreateBundleTargetGenerator);
 };
diff --git a/tools/gn/docs/reference.md b/tools/gn/docs/reference.md
index f06b517..9d62a5e 100644
--- a/tools/gn/docs/reference.md
+++ b/tools/gn/docs/reference.md
@@ -1334,7 +1334,7 @@
   }
 
   bundle_data("base_unittests_bundle_data]") {
-    sources = [ "test/data" ]
+    sources = [ "test/data" ]
     outputs = [
       "{{bundle_resources_dir}}/{{source_root_relative_dir}}/" +
           "{{source_file_part}}"
@@ -1500,8 +1500,8 @@
 
 ```
   bundle_root_dir*, bundle_resources_dir*, bundle_executable_dir*,
-  bundle_plugins_dir*, deps, data_deps, public_deps, visibility,
-  product_type, code_signing_args, code_signing_script,
+  bundle_plugins_dir*, bundle_deps_filter, deps, data_deps, public_deps,
+  visibility, product_type, code_signing_args, code_signing_script,
   code_signing_sources, code_signing_outputs
   * = required
 
@@ -4830,6 +4830,40 @@
 
 
 ```
+## **bundle_deps_filter**: [label list] A list of labels that are filtered out.
+
+```
+  A list of target labels.
+
+  This list contains target label patterns that should be filtered out
+  when creating the bundle. Any target matching one of those label will
+  be removed from the dependencies of the create_bundle target.
+
+  This is mostly useful when creating application extension bundle as
+  the application extension has access to runtime resources from the
+  application bundle and thus do not require a second copy.
+
+  See "gn help create_bundle" for more information.
+
+```
+
+### **Example**
+
+```
+  create_bundle("today_extension") {
+    deps = [
+      "//base"
+    ]
+    bundle_root_dir = "$root_out_dir/today_extension.appex"
+    bundle_deps_filter = [
+      # The extension uses //base but does not use any function calling
+      # into third_party/icu and thus does not need the icudtl.dat file.
+      "//third_party/icu:icudata",
+    ]
+  }
+
+
+```
 ## **include_dirs**: Additional include directories.
 
 ```
diff --git a/tools/gn/functions_target.cc b/tools/gn/functions_target.cc
index 8aa7f93..b7ee6fb3 100644
--- a/tools/gn/functions_target.cc
+++ b/tools/gn/functions_target.cc
@@ -279,7 +279,7 @@
     "  }\n"
     "\n"
     "  bundle_data(\"base_unittests_bundle_data]\") {\n"
-    "    sources = [ \"test/data\" ]\n"
+    "    sources = [ \"test/data\" ]\n"
     "    outputs = [\n"
     "      \"{{bundle_resources_dir}}/{{source_root_relative_dir}}/\" +\n"
     "          \"{{source_file_part}}\"\n"
@@ -353,8 +353,8 @@
     "Variables\n"
     "\n"
     "  bundle_root_dir*, bundle_resources_dir*, bundle_executable_dir*,\n"
-    "  bundle_plugins_dir*, deps, data_deps, public_deps, visibility,\n"
-    "  product_type, code_signing_args, code_signing_script,\n"
+    "  bundle_plugins_dir*, bundle_deps_filter, deps, data_deps, public_deps,\n"
+    "  visibility, product_type, code_signing_args, code_signing_script,\n"
     "  code_signing_sources, code_signing_outputs\n"
     "  * = required\n"
     "\n"
diff --git a/tools/gn/variables.cc b/tools/gn/variables.cc
index 948495c..f374934 100644
--- a/tools/gn/variables.cc
+++ b/tools/gn/variables.cc
@@ -608,6 +608,38 @@
     "\n"
     "  See \"gn help bundle_root_dir\" for examples.\n";
 
+const char kBundleDepsFilter[] = "bundle_deps_filter";
+const char kBundleDepsFilter_HelpShort[] =
+    "bundle_deps_filter: [label list] A list of labels that are filtered out.";
+const char kBundleDepsFilter_Help[] =
+    "bundle_deps_filter: [label list] A list of labels that are filtered out.\n"
+    "\n"
+    "  A list of target labels.\n"
+    "\n"
+    "  This list contains target label patterns that should be filtered out\n"
+    "  when creating the bundle. Any target matching one of those label will\n"
+    "  be removed from the dependencies of the create_bundle target.\n"
+    "\n"
+    "  This is mostly useful when creating application extension bundle as\n"
+    "  the application extension has access to runtime resources from the\n"
+    "  application bundle and thus do not require a second copy.\n"
+    "\n"
+    "  See \"gn help create_bundle\" for more information.\n"
+    "\n"
+    "Example\n"
+    "\n"
+    "  create_bundle(\"today_extension\") {\n"
+    "    deps = [\n"
+    "      \"//base\"\n"
+    "    ]\n"
+    "    bundle_root_dir = \"$root_out_dir/today_extension.appex\"\n"
+    "    bundle_deps_filter = [\n"
+    "      # The extension uses //base but does not use any function calling\n"
+    "      # into third_party/icu and thus does not need the icudtl.dat file.\n"
+    "      \"//third_party/icu:icudata\",\n"
+    "    ]\n"
+    "  }\n";
+
 const char kBundleExecutableDir[] = "bundle_executable_dir";
 const char kBundleExecutableDir_HelpShort[] =
     "bundle_executable_dir: "
@@ -1811,6 +1843,7 @@
     INSERT_VARIABLE(AssertNoDeps)
     INSERT_VARIABLE(BundleRootDir)
     INSERT_VARIABLE(BundleResourcesDir)
+    INSERT_VARIABLE(BundleDepsFilter)
     INSERT_VARIABLE(BundleExecutableDir)
     INSERT_VARIABLE(BundlePlugInsDir)
     INSERT_VARIABLE(Cflags)
diff --git a/tools/gn/variables.h b/tools/gn/variables.h
index 0e092e48..df94b65 100644
--- a/tools/gn/variables.h
+++ b/tools/gn/variables.h
@@ -111,6 +111,10 @@
 extern const char kBundleResourcesDir_HelpShort[];
 extern const char kBundleResourcesDir_Help[];
 
+extern const char kBundleDepsFilter[];
+extern const char kBundleDepsFilter_HelpShort[];
+extern const char kBundleDepsFilter_Help[];
+
 extern const char kBundleExecutableDir[];
 extern const char kBundleExecutableDir_HelpShort[];
 extern const char kBundleExecutableDir_Help[];