Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / cc / base / latency_info_swap_promise_monitor.cc
index 0f2ff74..f724d6c 100644 (file)
@@ -4,11 +4,38 @@
 
 #include "cc/base/latency_info_swap_promise_monitor.h"
 
+#include "base/threading/platform_thread.h"
 #include "cc/base/latency_info_swap_promise.h"
 #include "cc/trees/layer_tree_host.h"
 #include "cc/trees/layer_tree_host_impl.h"
 #include "cc/trees/layer_tree_impl.h"
 
+namespace {
+
+bool AddRenderingScheduledComponent(ui::LatencyInfo* latency_info) {
+  if (latency_info->FindLatency(
+          ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_COMPONENT, 0, NULL))
+    return false;
+  latency_info->AddLatencyNumber(
+      ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_COMPONENT, 0, 0);
+  return true;
+}
+
+bool AddForwardingScrollUpdateToMainComponent(ui::LatencyInfo* latency_info) {
+  if (latency_info->FindLatency(
+          ui::INPUT_EVENT_LATENCY_FORWARD_SCROLL_UPDATE_TO_MAIN_COMPONENT,
+          0,
+          NULL))
+    return false;
+  latency_info->AddLatencyNumber(
+      ui::INPUT_EVENT_LATENCY_FORWARD_SCROLL_UPDATE_TO_MAIN_COMPONENT,
+      0,
+      latency_info->trace_id);
+  return true;
+}
+
+}  // namespace
+
 namespace cc {
 
 LatencyInfoSwapPromiseMonitor::LatencyInfoSwapPromiseMonitor(
@@ -21,23 +48,50 @@ LatencyInfoSwapPromiseMonitor::LatencyInfoSwapPromiseMonitor(
 LatencyInfoSwapPromiseMonitor::~LatencyInfoSwapPromiseMonitor() {}
 
 void LatencyInfoSwapPromiseMonitor::OnSetNeedsCommitOnMain() {
-  if (!latency_->FindLatency(
-          ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_COMPONENT, 0, 0)) {
-    latency_->AddLatencyNumber(
-        ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_COMPONENT, 0, 0);
+  if (AddRenderingScheduledComponent(latency_)) {
     scoped_ptr<SwapPromise> swap_promise(new LatencyInfoSwapPromise(*latency_));
     layer_tree_host_->QueueSwapPromise(swap_promise.Pass());
   }
 }
 
 void LatencyInfoSwapPromiseMonitor::OnSetNeedsRedrawOnImpl() {
-  if (!latency_->FindLatency(
-          ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_COMPONENT, 0, 0)) {
-    latency_->AddLatencyNumber(
-        ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_COMPONENT, 0, 0);
+  if (AddRenderingScheduledComponent(latency_)) {
     scoped_ptr<SwapPromise> swap_promise(new LatencyInfoSwapPromise(*latency_));
     layer_tree_host_impl_->active_tree()->QueueSwapPromise(swap_promise.Pass());
   }
 }
 
+void LatencyInfoSwapPromiseMonitor::OnForwardScrollUpdateToMainThreadOnImpl() {
+  if (AddForwardingScrollUpdateToMainComponent(latency_)) {
+    int64 new_sequence_number = 0;
+    for (ui::LatencyInfo::LatencyMap::const_iterator it =
+             latency_->latency_components.begin();
+         it != latency_->latency_components.end();
+         ++it) {
+      if (it->first.first == ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT) {
+        new_sequence_number =
+            (static_cast<int64>(base::PlatformThread::CurrentId()) << 32) |
+            (it->second.sequence_number & 0xffffffff);
+        DCHECK(new_sequence_number != it->second.sequence_number);
+        break;
+      }
+    }
+    if (!new_sequence_number)
+      return;
+    ui::LatencyInfo new_latency;
+    new_latency.AddLatencyNumber(
+        ui::INPUT_EVENT_LATENCY_BEGIN_SCROLL_UPDATE_MAIN_COMPONENT,
+        0,
+        new_sequence_number);
+    new_latency.TraceEventType("ScrollUpdate");
+    new_latency.CopyLatencyFrom(
+        *latency_,
+        ui::INPUT_EVENT_LATENCY_FORWARD_SCROLL_UPDATE_TO_MAIN_COMPONENT);
+    scoped_ptr<SwapPromise> swap_promise(
+        new LatencyInfoSwapPromise(new_latency));
+    layer_tree_host_impl_->QueueSwapPromiseForMainThreadScrollUpdate(
+        swap_promise.Pass());
+  }
+}
+
 }  // namespace cc