Roll Chrome into Mojo.

This roll corresponds to:
https://chromium.googlesource.com/chromium/src/+/d3cf92cac313434de99ae66f6e3e12d27ab536ef

GN now requires python_binary_module to be undefined rather than an empty string.

Context lines in cc_strip_video.patch changed.

Minor edits were required for sky:
Change to Skia header file organization.
SkRect::intersect now warns if ignored.

BUG=https://code.google.com/p/chromium/issues/detail?id=401761
R=jamesr@chromium.org

Review URL: https://codereview.chromium.org/839143002
diff --git a/gpu/command_buffer/client/context_support.h b/gpu/command_buffer/client/context_support.h
index 2678ba9..6c5b23f 100644
--- a/gpu/command_buffer/client/context_support.h
+++ b/gpu/command_buffer/client/context_support.h
@@ -6,8 +6,8 @@
 #define GPU_COMMAND_BUFFER_CLIENT_CONTEXT_SUPPORT_H_
 
 #include "base/callback.h"
+#include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/overlay_transform.h"
-#include "ui/gfx/rect.h"
 
 namespace gpu {
 
diff --git a/gpu/command_buffer/client/gl_in_process_context.cc b/gpu/command_buffer/client/gl_in_process_context.cc
index 015a2a7..0f15f1d 100644
--- a/gpu/command_buffer/client/gl_in_process_context.cc
+++ b/gpu/command_buffer/client/gl_in_process_context.cc
@@ -26,7 +26,7 @@
 #include "gpu/command_buffer/client/transfer_buffer.h"
 #include "gpu/command_buffer/common/command_buffer.h"
 #include "gpu/command_buffer/common/constants.h"
-#include "ui/gfx/size.h"
+#include "ui/gfx/geometry/size.h"
 #include "ui/gl/gl_image.h"
 
 #if defined(OS_ANDROID)
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc
index a225478..5706086 100644
--- a/gpu/command_buffer/service/feature_info.cc
+++ b/gpu/command_buffer/service/feature_info.cc
@@ -289,6 +289,7 @@
   AddExtensionString("GL_CHROMIUM_resource_safe");
   AddExtensionString("GL_CHROMIUM_strict_attribs");
   AddExtensionString("GL_CHROMIUM_texture_mailbox");
+  AddExtensionString("GL_CHROMIUM_trace_marker");
   AddExtensionString("GL_EXT_debug_marker");
 
   if (feature_flags_.enable_subscribe_uniform) {
diff --git a/gpu/command_buffer/service/feature_info_unittest.cc b/gpu/command_buffer/service/feature_info_unittest.cc
index f5440e0..e81dad1 100644
--- a/gpu/command_buffer/service/feature_info_unittest.cc
+++ b/gpu/command_buffer/service/feature_info_unittest.cc
@@ -235,6 +235,7 @@
   EXPECT_THAT(info_->extensions(), HasSubstr("GL_CHROMIUM_strict_attribs"));
   EXPECT_THAT(info_->extensions(),
               HasSubstr("GL_ANGLE_translated_shader_source"));
+  EXPECT_THAT(info_->extensions(), HasSubstr("GL_CHROMIUM_trace_marker"));
 
   // Check a couple of random extensions that should not be there.
   EXPECT_THAT(info_->extensions(), Not(HasSubstr("GL_OES_texture_npot")));
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 9ad567a..7f9166e 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -1878,7 +1878,6 @@
   scoped_ptr<GPUStateTracer> gpu_state_tracer_;
   const unsigned char* cb_command_trace_category_;
   const unsigned char* gpu_decoder_category_;
-  const unsigned char* gpu_group_marker_category_;
   int gpu_trace_level_;
   bool gpu_trace_commands_;
   bool gpu_debug_commands_;
@@ -2396,8 +2395,6 @@
           TRACE_DISABLED_BY_DEFAULT("cb_command"))),
       gpu_decoder_category_(TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(
           TRACE_DISABLED_BY_DEFAULT("gpu_decoder"))),
-      gpu_group_marker_category_(TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(
-          TRACE_DISABLED_BY_DEFAULT("gpu_group_marker"))),
       gpu_trace_level_(2),
       gpu_trace_commands_(false),
       gpu_debug_commands_(false),
@@ -11006,17 +11003,13 @@
   }
   std::string name = length ? std::string(marker, length) : std::string(marker);
   debug_marker_manager_.PushGroup(name);
-  if (*gpu_group_marker_category_) {
-    gpu_tracer_->Begin(TRACE_DISABLED_BY_DEFAULT("gpu_group_marker"), name,
-                       kTraceGroupMarker);
-  }
+  gpu_tracer_->Begin(TRACE_DISABLED_BY_DEFAULT("gpu_group_marker"), name,
+                     kTraceGroupMarker);
 }
 
 void GLES2DecoderImpl::DoPopGroupMarkerEXT(void) {
   debug_marker_manager_.PopGroup();
-  if (*gpu_group_marker_category_) {
-    gpu_tracer_->End(kTraceGroupMarker);
-  }
+  gpu_tracer_->End(kTraceGroupMarker);
 }
 
 void GLES2DecoderImpl::DoBindTexImage2DCHROMIUM(
@@ -11124,8 +11117,6 @@
     return error::kInvalidArguments;
   }
 
-  TRACE_EVENT_COPY_ASYNC_BEGIN0(category_name.c_str(), trace_name.c_str(),
-                                this);
   if (!gpu_tracer_->Begin(category_name, trace_name, kTraceCHROMIUM)) {
     LOCAL_SET_GL_ERROR(
         GL_INVALID_OPERATION,
@@ -11136,16 +11127,11 @@
 }
 
 void GLES2DecoderImpl::DoTraceEndCHROMIUM() {
-  if (gpu_tracer_->CurrentCategory().empty() ||
-      gpu_tracer_->CurrentName().empty()) {
-    LOCAL_SET_GL_ERROR(
-        GL_INVALID_OPERATION,
-        "glTraceEndCHROMIUM", "no trace begin found");
+  if (!gpu_tracer_->End(kTraceCHROMIUM)) {
+    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
+                       "glTraceEndCHROMIUM", "no trace begin found");
     return;
   }
-  TRACE_EVENT_COPY_ASYNC_END0(gpu_tracer_->CurrentCategory().c_str(),
-                              gpu_tracer_->CurrentName().c_str(), this);
-  gpu_tracer_->End(kTraceCHROMIUM);
 }
 
 void GLES2DecoderImpl::DoDrawBuffersEXT(
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.h b/gpu/command_buffer/service/gles2_cmd_decoder.h
index 670ce75..0092a9a 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.h
@@ -16,7 +16,7 @@
 #include "gpu/command_buffer/common/capabilities.h"
 #include "gpu/command_buffer/service/common_decoder.h"
 #include "gpu/command_buffer/service/logger.h"
-#include "ui/gfx/size.h"
+#include "ui/gfx/geometry/size.h"
 #include "ui/gl/gl_context.h"
 
 namespace gfx {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_mock.h b/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
index 4428a40..35ff4c1 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
@@ -9,11 +9,11 @@
 
 #include <vector>
 
+#include "base/callback_forward.h"
 #include "gpu/command_buffer/common/mailbox.h"
 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
-#include "base/callback_forward.h"
 #include "testing/gmock/include/gmock/gmock.h"
-#include "ui/gfx/size.h"
+#include "ui/gfx/geometry/size.h"
 
 namespace gfx {
 class GLContext;
diff --git a/gpu/command_buffer/service/gpu_tracer.cc b/gpu/command_buffer/service/gpu_tracer.cc
index d7cd1b8..2853e96c 100644
--- a/gpu/command_buffer/service/gpu_tracer.cc
+++ b/gpu/command_buffer/service/gpu_tracer.cc
@@ -18,6 +18,16 @@
 static const unsigned int kProcessInterval = 16;
 static TraceOutputter* g_outputter_thread = NULL;
 
+CPUTime::CPUTime() {
+}
+
+int64 CPUTime::GetCurrentTime() {
+  return base::TimeTicks::NowFromSystemTraceTime().ToInternalValue();
+}
+
+CPUTime::~CPUTime() {
+}
+
 TraceMarker::TraceMarker(const std::string& category, const std::string& name)
     : category_(category),
       name_(name),
@@ -42,24 +52,47 @@
 
 TraceOutputter::~TraceOutputter() { g_outputter_thread = NULL; }
 
-void TraceOutputter::Trace(const std::string& category,
-                           const std::string& name,
-                           int64 start_time,
-                           int64 end_time) {
-  TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0(category.c_str(),
-                                                    name.c_str(),
-                                                    local_trace_id_,
-                                                    named_thread_.thread_id(),
-                                                    start_time);
-  TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0(category.c_str(),
-                                                  name.c_str(),
-                                                  local_trace_id_,
-                                                  named_thread_.thread_id(),
-                                                  end_time);
+void TraceOutputter::TraceDevice(const std::string& category,
+                                 const std::string& name,
+                                 int64 start_time,
+                                 int64 end_time) {
+  TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP1(
+      TRACE_DISABLED_BY_DEFAULT("gpu.device"),
+      name.c_str(),
+      local_trace_id_,
+      named_thread_.thread_id(),
+      start_time,
+      "gl_category",
+      category.c_str());
+  TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP1(
+      TRACE_DISABLED_BY_DEFAULT("gpu.device"),
+      name.c_str(),
+      local_trace_id_,
+      named_thread_.thread_id(),
+      end_time,
+      "gl_category",
+      category.c_str());
   ++local_trace_id_;
 }
 
+void TraceOutputter::TraceServiceBegin(const std::string& category,
+                                       const std::string& name,
+                                       void* id) {
+  TRACE_EVENT_COPY_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("gpu.service"),
+                                  name.c_str(), this,
+                                  "gl_category", category.c_str());
+}
+
+void TraceOutputter::TraceServiceEnd(const std::string& category,
+                                     const std::string& name,
+                                     void* id) {
+  TRACE_EVENT_COPY_ASYNC_END1(TRACE_DISABLED_BY_DEFAULT("gpu.service"),
+                                name.c_str(), this,
+                                "gl_category", category.c_str());
+}
+
 GPUTrace::GPUTrace(scoped_refptr<Outputter> outputter,
+                   scoped_refptr<CPUTime> cpu_time,
                    const std::string& category,
                    const std::string& name,
                    int64 offset,
@@ -67,6 +100,7 @@
     : category_(category),
       name_(name),
       outputter_(outputter),
+      cpu_time_(cpu_time),
       offset_(offset),
       start_time_(0),
       end_time_(0),
@@ -98,7 +132,7 @@
 
 void GPUTrace::Start(bool trace_service) {
   if (trace_service) {
-    TRACE_EVENT_COPY_ASYNC_BEGIN0(category().c_str(), name().c_str(), this);
+    outputter_->TraceServiceBegin(category_, name_, this);
   }
 
   switch (tracer_type_) {
@@ -115,7 +149,7 @@
       if (offset_ == 0) {
         GLint64 gl_now = 0;
         glGetInteger64v(GL_TIMESTAMP, &gl_now);
-        offset_ = base::TimeTicks::NowFromSystemTraceTime().ToInternalValue() -
+        offset_ = cpu_time_->GetCurrentTime() -
                   gl_now / base::Time::kNanosecondsPerMicrosecond;
       }
       // Intentionally fall through to kTracerTypeARBTimer case.xs
@@ -140,7 +174,7 @@
   }
 
   if (tracing_service) {
-    TRACE_EVENT_COPY_ASYNC_END0(category().c_str(), name().c_str(), this);
+    outputter_->TraceServiceEnd(category_, name_, this);
   }
 }
 
@@ -175,7 +209,7 @@
   start_time_ = (begin_stamp / base::Time::kNanosecondsPerMicrosecond) +
                 offset_;
   end_time_ = (end_stamp / base::Time::kNanosecondsPerMicrosecond) + offset_;
-  outputter_->Trace(category(), name(), start_time_, end_time_);
+  outputter_->TraceDevice(category_, name_, start_time_, end_time_);
 }
 
 GPUTracer::GPUTracer(gles2::GLES2Decoder* decoder)
@@ -185,18 +219,10 @@
           TRACE_DISABLED_BY_DEFAULT("gpu.device"))),
       decoder_(decoder),
       timer_offset_(0),
-      last_tracer_source_(kTraceGroupInvalid),
       tracer_type_(kTracerTypeInvalid),
       gpu_timing_synced_(false),
       gpu_executing_(false),
       process_posted_(false) {
-  if (gfx::g_driver_gl.ext.b_GL_EXT_disjoint_timer_query) {
-    tracer_type_ = kTracerTypeDisjointTimer;
-    outputter_ = TraceOutputter::Create("GL_EXT_disjoint_timer_query");
-  } else if (gfx::g_driver_gl.ext.b_GL_ARB_timer_query) {
-    tracer_type_ = kTracerTypeARBTimer;
-    outputter_ = TraceOutputter::Create("GL_ARB_timer_query");
-  }
 }
 
 GPUTracer::~GPUTracer() {
@@ -206,6 +232,28 @@
   if (gpu_executing_)
     return false;
 
+  if (outputter_ == NULL) {
+    tracer_type_ = DetermineTracerType();
+    const char* tracer_type_name = "Unknown";
+    switch (tracer_type_) {
+      case kTracerTypeDisjointTimer:
+        tracer_type_name = "GL_EXT_disjoint_timer_query";
+        break;
+      case kTracerTypeARBTimer:
+        tracer_type_name = "GL_ARB_timer_query";
+        break;
+
+      default:
+        break;
+    }
+
+    outputter_ = CreateOutputter(tracer_type_name);
+  }
+
+  if (cpu_time_ == NULL) {
+    cpu_time_ = CreateCPUTime();
+  }
+
   CalculateTimerOffset();
   gpu_executing_ = true;
 
@@ -237,10 +285,12 @@
   if (IsTracing()) {
     for (int n = 0; n < NUM_TRACER_SOURCES; n++) {
       for (size_t i = 0; i < markers_[n].size(); i++) {
-        if (markers_[n][i].trace_.get()) {
-          markers_[n][i].trace_->End(*gpu_trace_srv_category != 0);
-          if (markers_[n][i].trace_->IsEnabled())
-            traces_.push_back(markers_[n][i].trace_);
+        TraceMarker& marker = markers_[n][i];
+        if (marker.trace_.get()) {
+          marker.trace_->End(*gpu_trace_srv_category != 0);
+          if (marker.trace_->IsEnabled())
+            traces_.push_back(marker.trace_);
+
           markers_[n][i].trace_ = 0;
         }
       }
@@ -263,7 +313,6 @@
   DCHECK(source >= 0 && source < NUM_TRACER_SOURCES);
 
   // Push new marker from given 'source'
-  last_tracer_source_ = source;
   markers_[source].push_back(TraceMarker(category, name));
 
   // Create trace
@@ -304,20 +353,20 @@
   return (*gpu_trace_srv_category != 0) || (*gpu_trace_dev_category != 0);
 }
 
-const std::string& GPUTracer::CurrentCategory() const {
-  if (last_tracer_source_ >= 0 &&
-      last_tracer_source_ < NUM_TRACER_SOURCES &&
-      !markers_[last_tracer_source_].empty()) {
-    return markers_[last_tracer_source_].back().category_;
+const std::string& GPUTracer::CurrentCategory(GpuTracerSource source) const {
+  if (source >= 0 &&
+      source < NUM_TRACER_SOURCES &&
+      !markers_[source].empty()) {
+    return markers_[source].back().category_;
   }
   return base::EmptyString();
 }
 
-const std::string& GPUTracer::CurrentName() const {
-  if (last_tracer_source_ >= 0 &&
-      last_tracer_source_ < NUM_TRACER_SOURCES &&
-      !markers_[last_tracer_source_].empty()) {
-    return markers_[last_tracer_source_].back().name_;
+const std::string& GPUTracer::CurrentName(GpuTracerSource source) const {
+  if (source >= 0 &&
+      source < NUM_TRACER_SOURCES &&
+      !markers_[source].empty()) {
+    return markers_[source].back().name_;
   }
   return base::EmptyString();
 }
@@ -327,7 +376,33 @@
   GpuTracerType tracer_type = *gpu_trace_dev_category ? tracer_type_ :
                                                         kTracerTypeInvalid;
 
-  return new GPUTrace(outputter_, category, name, timer_offset_, tracer_type);
+  return new GPUTrace(outputter_, cpu_time_, category, name,
+                      timer_offset_, tracer_type);
+}
+
+scoped_refptr<Outputter> GPUTracer::CreateOutputter(const std::string& name) {
+  return TraceOutputter::Create(name);
+}
+
+scoped_refptr<CPUTime> GPUTracer::CreateCPUTime() {
+  return new CPUTime();
+}
+
+GpuTracerType GPUTracer::DetermineTracerType() {
+  if (gfx::g_driver_gl.ext.b_GL_EXT_disjoint_timer_query) {
+    return kTracerTypeDisjointTimer;
+  } else if (gfx::g_driver_gl.ext.b_GL_ARB_timer_query) {
+    return kTracerTypeARBTimer;
+  }
+
+  return kTracerTypeInvalid;
+}
+
+void GPUTracer::PostTask() {
+  base::MessageLoop::current()->PostDelayedTask(
+      FROM_HERE,
+      base::Bind(&GPUTracer::Process, base::AsWeakPtr(this)),
+      base::TimeDelta::FromMilliseconds(kProcessInterval));
 }
 
 void GPUTracer::Process() {
@@ -401,10 +476,8 @@
     glGetQueryObjectui64v(query, GL_QUERY_RESULT, &gl_now);
     glDeleteQueriesARB(1, &query);
 
-    base::TimeTicks system_now = base::TimeTicks::NowFromSystemTraceTime();
-
     gl_now /= base::Time::kNanosecondsPerMicrosecond;
-    timer_offset_ = system_now.ToInternalValue() - gl_now;
+    timer_offset_ = cpu_time_->GetCurrentTime() - gl_now;
     gpu_timing_synced_ = true;
   }
 }
@@ -414,10 +487,7 @@
     return;
 
   process_posted_ = true;
-  base::MessageLoop::current()->PostDelayedTask(
-      FROM_HERE,
-      base::Bind(&GPUTracer::Process, base::AsWeakPtr(this)),
-      base::TimeDelta::FromMilliseconds(kProcessInterval));
+  PostTask();
 }
 
 }  // namespace gles2
diff --git a/gpu/command_buffer/service/gpu_tracer.h b/gpu/command_buffer/service/gpu_tracer.h
index 6033220..64f13cc 100644
--- a/gpu/command_buffer/service/gpu_tracer.h
+++ b/gpu/command_buffer/service/gpu_tracer.h
@@ -40,6 +40,21 @@
   kTracerTypeDisjointTimer
 };
 
+// Central accesser to CPU Time
+class GPU_EXPORT CPUTime
+    : public base::RefCounted<CPUTime> {
+ public:
+  CPUTime();
+
+  virtual int64 GetCurrentTime();
+
+ protected:
+  virtual ~CPUTime();
+  friend class base::RefCounted<CPUTime>;
+
+  DISALLOW_COPY_AND_ASSIGN(CPUTime);
+};
+
 // Marker structure for a Trace.
 struct TraceMarker {
   TraceMarker(const std::string& category, const std::string& name);
@@ -51,10 +66,11 @@
 };
 
 // Traces GPU Commands.
-class GPUTracer : public base::SupportsWeakPtr<GPUTracer> {
+class GPU_EXPORT GPUTracer
+    : public base::SupportsWeakPtr<GPUTracer> {
  public:
   explicit GPUTracer(gles2::GLES2Decoder* decoder);
-  ~GPUTracer();
+  virtual ~GPUTracer();
 
   // Scheduled processing in decoder begins.
   bool BeginDecoding();
@@ -69,17 +85,22 @@
   // End the last started trace marker.
   bool End(GpuTracerSource source);
 
-  bool IsTracing();
+  virtual bool IsTracing();
 
   // Retrieve the name of the current open trace.
   // Returns empty string if no current open trace.
-  const std::string& CurrentCategory() const;
-  const std::string& CurrentName() const;
+  const std::string& CurrentCategory(GpuTracerSource source) const;
+  const std::string& CurrentName(GpuTracerSource source) const;
 
- private:
+ protected:
   // Trace Processing.
   scoped_refptr<GPUTrace> CreateTrace(const std::string& category,
                                       const std::string& name);
+  virtual scoped_refptr<Outputter> CreateOutputter(const std::string& name);
+  virtual scoped_refptr<CPUTime> CreateCPUTime();
+  virtual GpuTracerType DetermineTracerType();
+  virtual void PostTask();
+
   void Process();
   void ProcessTraces();
 
@@ -87,6 +108,7 @@
   void IssueProcessTask();
 
   scoped_refptr<Outputter> outputter_;
+  scoped_refptr<CPUTime> cpu_time_;
   std::vector<TraceMarker> markers_[NUM_TRACER_SOURCES];
   std::deque<scoped_refptr<GPUTrace> > traces_;
 
@@ -95,7 +117,6 @@
   gles2::GLES2Decoder* decoder_;
 
   int64 timer_offset_;
-  GpuTracerSource last_tracer_source_;
 
   GpuTracerType tracer_type_;
   bool gpu_timing_synced_;
@@ -107,10 +128,18 @@
 
 class Outputter : public base::RefCounted<Outputter> {
  public:
-  virtual void Trace(const std::string& category,
-                     const std::string& name,
-                     int64 start_time,
-                     int64 end_time) = 0;
+  virtual void TraceDevice(const std::string& category,
+                           const std::string& name,
+                           int64 start_time,
+                           int64 end_time) = 0;
+
+  virtual void TraceServiceBegin(const std::string& category,
+                                 const std::string& name,
+                                 void* id) = 0;
+
+  virtual void TraceServiceEnd(const std::string& category,
+                               const std::string& name,
+                               void* id) = 0;
 
  protected:
   virtual ~Outputter() {}
@@ -120,10 +149,18 @@
 class TraceOutputter : public Outputter {
  public:
   static scoped_refptr<TraceOutputter> Create(const std::string& name);
-  void Trace(const std::string& category,
-             const std::string& name,
-             int64 start_time,
-             int64 end_time) override;
+  void TraceDevice(const std::string& category,
+                   const std::string& name,
+                   int64 start_time,
+                   int64 end_time) override;
+
+  void TraceServiceBegin(const std::string& category,
+                         const std::string& name,
+                         void* id) override;
+
+  void TraceServiceEnd(const std::string& category,
+                       const std::string& name,
+                       void* id) override;
 
  protected:
   friend class base::RefCounted<Outputter>;
@@ -140,6 +177,7 @@
     : public base::RefCounted<GPUTrace> {
  public:
   GPUTrace(scoped_refptr<Outputter> outputter,
+           scoped_refptr<CPUTime> cpu_time,
            const std::string& category,
            const std::string& name,
            int64 offset,
@@ -147,9 +185,6 @@
 
   bool IsEnabled() { return tracer_type_ != kTracerTypeInvalid; }
 
-  const std::string& category() { return category_; }
-  const std::string& name() { return name_; }
-
   void Start(bool trace_service);
   void End(bool tracing_service);
   bool IsAvailable();
@@ -165,6 +200,7 @@
   std::string category_;
   std::string name_;
   scoped_refptr<Outputter> outputter_;
+  scoped_refptr<CPUTime> cpu_time_;
 
   int64 offset_;
   int64 start_time_;
diff --git a/gpu/command_buffer/service/gpu_tracer_unittest.cc b/gpu/command_buffer/service/gpu_tracer_unittest.cc
index ccf4d6d..ae4c970 100644
--- a/gpu/command_buffer/service/gpu_tracer_unittest.cc
+++ b/gpu/command_buffer/service/gpu_tracer_unittest.cc
@@ -5,27 +5,59 @@
 #include <map>
 #include <set>
 
+#include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
 #include "gpu/command_buffer/service/gpu_service_test.h"
 #include "gpu/command_buffer/service/gpu_tracer.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gl/gl_context_stub.h"
 #include "ui/gl/gl_mock.h"
+#include "ui/gl/gl_surface_stub.h"
 
 namespace gpu {
 namespace gles2 {
 
-using ::testing::Return;
-using ::testing::NotNull;
-using ::testing::AtLeast;
-using ::testing::Invoke;
 using ::testing::_;
+using ::testing::AtLeast;
+using ::testing::Exactly;
+using ::testing::Invoke;
+using ::testing::NotNull;
+using ::testing::Return;
+
+class FakeCPUTime : public CPUTime {
+ public:
+  FakeCPUTime()
+      : current_cpu_time_(0) {
+  }
+
+  int64 GetCurrentTime() override {
+    return current_cpu_time_;
+  }
+
+  void SetFakeCPUTime(int64 cpu_time) {
+    current_cpu_time_ = cpu_time;
+  }
+
+ protected:
+  ~FakeCPUTime() override {}
+
+  int64 current_cpu_time_;
+};
 
 class MockOutputter : public Outputter {
  public:
   MockOutputter() {}
-  MOCK_METHOD4(Trace,
+  MOCK_METHOD4(TraceDevice,
                void(const std::string& category, const std::string& name,
                     int64 start_time, int64 end_time));
 
+  MOCK_METHOD3(TraceServiceBegin,
+               void(const std::string& category, const std::string& name,
+                    void* id));
+
+  MOCK_METHOD3(TraceServiceEnd,
+               void(const std::string& category, const std::string& name,
+                    void* id));
+
  protected:
   ~MockOutputter() {}
 };
@@ -42,6 +74,7 @@
   }
 
   void SetCurrentGLTime(GLint64 current_time) { current_time_ = current_time; }
+  void SetDisjoint() { disjointed_ = true; }
 
   void GenQueriesARB(GLsizei n, GLuint* ids) {
     for (GLsizei i = 0; i < n; i++) {
@@ -68,7 +101,7 @@
         break;
       }
       default:
-        ASSERT_TRUE(false);
+        FAIL() << "Invalid variable passed to GetQueryObjectiv: " << pname;
     }
   }
 
@@ -79,7 +112,17 @@
         query_timestamp_[id] = current_time_;
         break;
       default:
-        ASSERT_TRUE(false);
+        FAIL() << "Invalid variable passed to QueryCounter: " << target;
+    }
+  }
+
+  void GetInteger64v(GLenum pname, GLint64 * data) {
+    switch (pname) {
+      case GL_TIMESTAMP:
+        *data = current_time_;
+        break;
+      default:
+        FAIL() << "Invalid variable passed to GetInteger64v: " << pname;
     }
   }
 
@@ -90,29 +133,258 @@
         *params = query_timestamp_.find(id)->second;
         break;
       default:
-        ASSERT_TRUE(false);
+        FAIL() << "Invalid variable passed to GetQueryObjectui64v: " << pname;
     }
   }
 
+  void GetIntegerv(GLenum pname, GLint* params) {
+    switch (pname) {
+      case GL_GPU_DISJOINT_EXT:
+        *params = static_cast<GLint>(disjointed_);
+        disjointed_ = false;
+        break;
+      default:
+        FAIL() << "Invalid variable passed to GetIntegerv: " << pname;
+    }
+  }
+
+  void Finish() {
+  }
+
+  GLenum GetError() {
+    return GL_NO_ERROR;
+  }
+
  protected:
+  bool disjointed_;
   GLint64 current_time_;
   GLuint next_query_id_;
   std::set<GLuint> alloced_queries_;
   std::map<GLuint, GLint64> query_timestamp_;
 };
 
-class BaseGpuTracerTest : public GpuServiceTest {
+class GPUTracerTester : public GPUTracer {
  public:
-  BaseGpuTracerTest() {}
+  GPUTracerTester(GpuTracerType tracer_type, gles2::GLES2Decoder* decoder)
+      : GPUTracer(decoder),
+        tracing_enabled_(0),
+        test_tracer_type_(tracer_type) {
+    // Force tracing to be dependent on our mock variable here.
+    gpu_trace_srv_category = &tracing_enabled_;
+    gpu_trace_dev_category = &tracing_enabled_;
+  }
 
-  ///////////////////////////////////////////////////////////////////////////
+  ~GPUTracerTester() override {}
+
+  void SetTracingEnabled(bool enabled) {
+    tracing_enabled_ = enabled ? 1 : 0;
+  }
+
+  void SetOutputter(scoped_refptr<Outputter> outputter) {
+    set_outputter_ = outputter;
+  }
+
+  void SetCPUTime(scoped_refptr<CPUTime> cputime) {
+    set_cputime_ = cputime;
+  }
+
+ protected:
+  scoped_refptr<Outputter> CreateOutputter(const std::string& name) override {
+    if (set_outputter_.get()) {
+      return set_outputter_;
+    }
+    return new MockOutputter();
+  }
+
+  scoped_refptr<CPUTime> CreateCPUTime() override {
+    if (set_cputime_.get()) {
+      return set_cputime_;
+    }
+    return new FakeCPUTime();
+  }
+
+  GpuTracerType DetermineTracerType() override {
+    return test_tracer_type_;
+  }
+
+  void PostTask() override {
+    // Process synchronously.
+    Process();
+  }
+
+  unsigned char tracing_enabled_;
+  GpuTracerType test_tracer_type_;
+
+  scoped_refptr<Outputter> set_outputter_;
+  scoped_refptr<CPUTime> set_cputime_;
+};
+
+class BaseGpuTest : public GpuServiceTest {
+ public:
+  BaseGpuTest(GpuTracerType test_tracer_type)
+      : test_tracer_type_(test_tracer_type) {
+  }
+
+ protected:
+  void SetUp() override {
+    GpuServiceTest::SetUp();
+    gl_fake_queries_.Reset();
+    gl_surface_ = new gfx::GLSurfaceStub();
+    gl_context_ = new gfx::GLContextStub();
+    gl_context_->MakeCurrent(gl_surface_.get());
+
+    outputter_ref_ = new MockOutputter();
+    cpu_time_ref_ = new FakeCPUTime;
+  }
+
+  void TearDown() override {
+    outputter_ref_ = NULL;
+    cpu_time_ref_ = NULL;
+
+    gl_context_->ReleaseCurrent(gl_surface_.get());
+    gl_context_ = NULL;
+    gl_surface_ = NULL;
+
+    gl_.reset();
+    gl_fake_queries_.Reset();
+    GpuServiceTest::TearDown();
+  }
+
+  void ExpectTraceQueryMocks() {
+    if (GetTracerType() != kTracerTypeInvalid) {
+      // Delegate query APIs used by GPUTrace to a GlFakeQueries
+      EXPECT_CALL(*gl_, GenQueriesARB(2, NotNull())).Times(AtLeast(1))
+          .WillRepeatedly(
+              Invoke(&gl_fake_queries_, &GlFakeQueries::GenQueriesARB));
+
+      EXPECT_CALL(*gl_, GetQueryObjectiv(_, GL_QUERY_RESULT_AVAILABLE,
+                                         NotNull()))
+          .WillRepeatedly(
+               Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectiv));
+
+      if (GetTracerType() == kTracerTypeDisjointTimer) {
+        EXPECT_CALL(*gl_, GetInteger64v(GL_TIMESTAMP, _))
+          .WillRepeatedly(
+               Invoke(&gl_fake_queries_, &GlFakeQueries::GetInteger64v));
+      }
+
+      EXPECT_CALL(*gl_, QueryCounter(_, GL_TIMESTAMP)).Times(AtLeast(2))
+          .WillRepeatedly(
+               Invoke(&gl_fake_queries_, &GlFakeQueries::QueryCounter));
+
+      EXPECT_CALL(*gl_, GetQueryObjectui64v(_, GL_QUERY_RESULT, NotNull()))
+          .WillRepeatedly(
+               Invoke(&gl_fake_queries_,
+                      &GlFakeQueries::GetQueryObjectui64v));
+
+      EXPECT_CALL(*gl_, DeleteQueriesARB(2, NotNull())).Times(AtLeast(1))
+          .WillRepeatedly(
+               Invoke(&gl_fake_queries_, &GlFakeQueries::DeleteQueriesARB));
+    }
+  }
+
+  void ExpectOutputterBeginMocks(MockOutputter* outputter,
+                                 const std::string& category,
+                                 const std::string& name) {
+    EXPECT_CALL(*outputter,
+                TraceServiceBegin(category, name, NotNull()));
+  }
+
+  void ExpectOutputterEndMocks(MockOutputter* outputter,
+                               const std::string& category,
+                               const std::string& name, int64 expect_start_time,
+                               int64 expect_end_time,
+                               bool trace_device) {
+    EXPECT_CALL(*outputter,
+                TraceServiceEnd(category, name, NotNull()));
+
+    if (trace_device) {
+      EXPECT_CALL(*outputter,
+                  TraceDevice(category, name,
+                              expect_start_time, expect_end_time))
+          .Times(Exactly(1));
+    } else {
+      EXPECT_CALL(*outputter, TraceDevice(category, name,
+                                          expect_start_time, expect_end_time))
+          .Times(Exactly(0));
+    }
+  }
+
+  void ExpectOutputterMocks(MockOutputter* outputter,
+                            const std::string& category,
+                            const std::string& name, int64 expect_start_time,
+                            int64 expect_end_time) {
+    ExpectOutputterBeginMocks(outputter, category, name);
+    ExpectOutputterEndMocks(outputter, category, name,
+                            expect_start_time, expect_end_time,
+                            GetTracerType() != kTracerTypeInvalid);
+  }
+
+  void ExpectTracerOffsetQueryMocks() {
+    // Disjoint check should only be called by kTracerTypeDisjointTimer type.
+    if (GetTracerType() == kTracerTypeDisjointTimer) {
+      EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(AtLeast(1))
+          .WillRepeatedly(
+              Invoke(&gl_fake_queries_, &GlFakeQueries::GetIntegerv));
+    } else {
+      EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(Exactly(0));
+    }
+
+    // Timer offset calculation should only happen for the regular timer.
+    if (GetTracerType() != kTracerTypeARBTimer) {
+      EXPECT_CALL(*gl_, GenQueriesARB(_, NotNull())).Times(Exactly(0));
+      EXPECT_CALL(*gl_, Finish()).Times(Exactly(0));
+      EXPECT_CALL(*gl_, QueryCounter(_, GL_TIMESTAMP)).Times(Exactly(0));
+      EXPECT_CALL(*gl_, GetQueryObjectui64v(_, GL_QUERY_RESULT, NotNull()))
+          .Times(Exactly(0));
+      EXPECT_CALL(*gl_, DeleteQueriesARB(_, NotNull())).Times(Exactly(0));
+    } else {
+      EXPECT_CALL(*gl_, GenQueriesARB(_, NotNull())).Times(AtLeast(1))
+          .WillRepeatedly(
+              Invoke(&gl_fake_queries_, &GlFakeQueries::GenQueriesARB));
+
+      EXPECT_CALL(*gl_, Finish()).Times(AtLeast(2))
+          .WillRepeatedly(
+              Invoke(&gl_fake_queries_, &GlFakeQueries::Finish));
+
+      EXPECT_CALL(*gl_, QueryCounter(_, GL_TIMESTAMP))
+          .Times(AtLeast(1))
+          .WillRepeatedly(
+               Invoke(&gl_fake_queries_, &GlFakeQueries::QueryCounter));
+
+      EXPECT_CALL(*gl_, GetQueryObjectui64v(_, GL_QUERY_RESULT, NotNull()))
+          .Times(AtLeast(1))
+          .WillRepeatedly(
+               Invoke(&gl_fake_queries_,
+                      &GlFakeQueries::GetQueryObjectui64v));
+
+      EXPECT_CALL(*gl_, DeleteQueriesARB(1, NotNull()))
+          .Times(AtLeast(1))
+          .WillRepeatedly(
+               Invoke(&gl_fake_queries_, &GlFakeQueries::DeleteQueriesARB));
+    }
+  }
+
+  GpuTracerType GetTracerType() { return test_tracer_type_; }
+
+  GpuTracerType test_tracer_type_;
+  GlFakeQueries gl_fake_queries_;
+
+  scoped_refptr<MockOutputter> outputter_ref_;
+  scoped_refptr<FakeCPUTime> cpu_time_ref_;
+
+  scoped_refptr<gfx::GLSurface> gl_surface_;
+  scoped_refptr<gfx::GLContext> gl_context_;
+};
+
+// Test GPUTrace calls all the correct gl calls.
+class BaseGpuTraceTest : public BaseGpuTest {
+ public:
+  BaseGpuTraceTest(GpuTracerType test_tracer_type)
+      : BaseGpuTest(test_tracer_type) {
+  }
 
   void DoTraceTest() {
-    MockOutputter* outputter = new MockOutputter();
-    scoped_refptr<Outputter> outputter_ref = outputter;
-
-    SetupTimerQueryMocks();
-
     // Expected results
     const std::string category_name("trace_category");
     const std::string trace_name("trace_test");
@@ -125,13 +397,12 @@
     const int64 expect_end_time =
         (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time;
 
-    // Expected Outputter::Trace call
-    EXPECT_CALL(*outputter,
-                Trace(category_name, trace_name,
-                      expect_start_time, expect_end_time));
+    ExpectTraceQueryMocks();
+    ExpectOutputterMocks(outputter_ref_.get(), category_name, trace_name,
+                         expect_start_time, expect_end_time);
 
     scoped_refptr<GPUTrace> trace =
-        new GPUTrace(outputter_ref, category_name, trace_name,
+        new GPUTrace(outputter_ref_, cpu_time_ref_, category_name, trace_name,
                      offset_time, GetTracerType());
 
     gl_fake_queries_.SetCurrentGLTime(start_timestamp);
@@ -154,73 +425,275 @@
 
     // Proces should output expected Trace results to MockOutputter
     trace->Process();
+
+    outputter_ref_ = NULL;
+    cpu_time_ref_ = NULL;
+  }
+};
+
+class GpuARBTimerTraceTest : public BaseGpuTraceTest {
+ public:
+  GpuARBTimerTraceTest()
+      : BaseGpuTraceTest(kTracerTypeARBTimer) {
+  }
+};
+
+class GpuDisjointTimerTraceTest : public BaseGpuTraceTest {
+ public:
+  GpuDisjointTimerTraceTest()
+      : BaseGpuTraceTest(kTracerTypeDisjointTimer) {
+  }
+};
+
+TEST_F(GpuARBTimerTraceTest, ARBTimerTraceTest) {
+  DoTraceTest();
+}
+
+TEST_F(GpuDisjointTimerTraceTest, DisjointTimerTraceTest) {
+  DoTraceTest();
+}
+
+// Test GPUTracer calls all the correct gl calls.
+class BaseGpuTracerTest : public BaseGpuTest {
+ public:
+  BaseGpuTracerTest(GpuTracerType test_tracer_type)
+      : BaseGpuTest(test_tracer_type) {
   }
 
- protected:
-  void SetUp() override {
-    GpuServiceTest::SetUp();
-    gl_fake_queries_.Reset();
+  void DoBasicTracerTest() {
+    ExpectTracerOffsetQueryMocks();
+
+    MockGLES2Decoder decoder;
+    GPUTracerTester tracer(test_tracer_type_, &decoder);
+    tracer.SetTracingEnabled(true);
+
+    tracer.SetOutputter(outputter_ref_);
+    tracer.SetCPUTime(cpu_time_ref_);
+
+    ASSERT_TRUE(tracer.BeginDecoding());
+    ASSERT_TRUE(tracer.EndDecoding());
+
+    outputter_ref_ = NULL;
+    cpu_time_ref_ = NULL;
   }
 
-  void TearDown() override {
-    gl_.reset();
-    gl_fake_queries_.Reset();
-    GpuServiceTest::TearDown();
+  void DoTracerMarkersTest() {
+    ExpectTracerOffsetQueryMocks();
+
+    EXPECT_CALL(*gl_, GetError()).Times(AtLeast(0))
+          .WillRepeatedly(
+               Invoke(&gl_fake_queries_, &GlFakeQueries::GetError));
+
+    const std::string category_name("trace_category");
+    const std::string trace_name("trace_test");
+    const int64 offset_time = 3231;
+    const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond;
+    const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond;
+    const int64 expect_start_time =
+        (start_timestamp / base::Time::kNanosecondsPerMicrosecond) +
+        offset_time;
+    const int64 expect_end_time =
+        (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time;
+
+    MockGLES2Decoder decoder;
+    GPUTracerTester tracer(test_tracer_type_, &decoder);
+    tracer.SetTracingEnabled(true);
+
+    tracer.SetOutputter(outputter_ref_);
+    tracer.SetCPUTime(cpu_time_ref_);
+
+    gl_fake_queries_.SetCurrentGLTime(start_timestamp);
+    cpu_time_ref_->SetFakeCPUTime(expect_start_time);
+
+    ASSERT_TRUE(tracer.BeginDecoding());
+
+    ExpectTraceQueryMocks();
+
+    // This will test multiple marker sources which overlap one another.
+    for (int i = 0; i < NUM_TRACER_SOURCES; ++i) {
+      // Set times so each source has a different time.
+      gl_fake_queries_.SetCurrentGLTime(
+          start_timestamp +
+          (i * base::Time::kNanosecondsPerMicrosecond));
+      cpu_time_ref_->SetFakeCPUTime(expect_start_time + i);
+
+      // Each trace name should be different to differentiate.
+      const char num_char = static_cast<char>('0' + i);
+      std::string source_category = category_name + num_char;
+      std::string source_trace_name = trace_name + num_char;
+
+      ExpectOutputterBeginMocks(outputter_ref_.get(),
+                                source_category, source_trace_name);
+
+      const GpuTracerSource source = static_cast<GpuTracerSource>(i);
+      ASSERT_TRUE(tracer.Begin(source_category, source_trace_name, source));
+    }
+
+    for (int i = 0; i < NUM_TRACER_SOURCES; ++i) {
+      // Set times so each source has a different time.
+      gl_fake_queries_.SetCurrentGLTime(
+          end_timestamp +
+          (i * base::Time::kNanosecondsPerMicrosecond));
+      cpu_time_ref_->SetFakeCPUTime(expect_end_time + i);
+
+      // Each trace name should be different to differentiate.
+      const char num_char = static_cast<char>('0' + i);
+      std::string source_category = category_name + num_char;
+      std::string source_trace_name = trace_name + num_char;
+
+      ExpectOutputterEndMocks(outputter_ref_.get(), source_category,
+                              source_trace_name,
+                              expect_start_time + i, expect_end_time + i,
+                              GetTracerType() != kTracerTypeInvalid);
+
+      const GpuTracerSource source = static_cast<GpuTracerSource>(i);
+
+      // Check if the current category/name are correct for this source.
+      ASSERT_EQ(source_category, tracer.CurrentCategory(source));
+      ASSERT_EQ(source_trace_name, tracer.CurrentName(source));
+
+      ASSERT_TRUE(tracer.End(source));
+    }
+
+    ASSERT_TRUE(tracer.EndDecoding());
+
+    outputter_ref_ = NULL;
+    cpu_time_ref_ = NULL;
   }
 
-  virtual void SetupTimerQueryMocks() {
-    // Delegate query APIs used by GPUTrace to a GlFakeQueries
-    EXPECT_CALL(*gl_, GenQueriesARB(_, NotNull())).Times(AtLeast(1)).WillOnce(
-        Invoke(&gl_fake_queries_, &GlFakeQueries::GenQueriesARB));
+  void DoDisjointTest() {
+    // Cause a disjoint in a middle of a trace and expect no output calls.
+    ExpectTracerOffsetQueryMocks();
 
-    EXPECT_CALL(*gl_, GetQueryObjectiv(_, GL_QUERY_RESULT_AVAILABLE, NotNull()))
-        .Times(AtLeast(2))
-        .WillRepeatedly(
-             Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectiv));
+    EXPECT_CALL(*gl_, GetError()).Times(AtLeast(0))
+          .WillRepeatedly(
+               Invoke(&gl_fake_queries_, &GlFakeQueries::GetError));
 
-    EXPECT_CALL(*gl_, QueryCounter(_, GL_TIMESTAMP))
-        .Times(AtLeast(2))
-        .WillRepeatedly(
-             Invoke(&gl_fake_queries_, &GlFakeQueries::QueryCounter));
+    const std::string category_name("trace_category");
+    const std::string trace_name("trace_test");
+    const GpuTracerSource source = static_cast<GpuTracerSource>(0);
+    const int64 offset_time = 3231;
+    const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond;
+    const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond;
+    const int64 expect_start_time =
+        (start_timestamp / base::Time::kNanosecondsPerMicrosecond) +
+        offset_time;
+    const int64 expect_end_time =
+        (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time;
 
-    EXPECT_CALL(*gl_, GetQueryObjectui64v(_, GL_QUERY_RESULT, NotNull()))
-        .Times(AtLeast(2))
-        .WillRepeatedly(
-             Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectui64v));
+    MockGLES2Decoder decoder;
+    GPUTracerTester tracer(test_tracer_type_, &decoder);
+    tracer.SetTracingEnabled(true);
 
-    EXPECT_CALL(*gl_, DeleteQueriesARB(2, NotNull()))
-        .Times(AtLeast(1))
-        .WillRepeatedly(
-             Invoke(&gl_fake_queries_, &GlFakeQueries::DeleteQueriesARB));
+    tracer.SetOutputter(outputter_ref_);
+    tracer.SetCPUTime(cpu_time_ref_);
+
+    gl_fake_queries_.SetCurrentGLTime(start_timestamp);
+    cpu_time_ref_->SetFakeCPUTime(expect_start_time);
+
+    ASSERT_TRUE(tracer.BeginDecoding());
+
+    ExpectTraceQueryMocks();
+
+    ExpectOutputterBeginMocks(outputter_ref_.get(),
+                              category_name, trace_name);
+    ASSERT_TRUE(tracer.Begin(category_name, trace_name, source));
+
+    gl_fake_queries_.SetCurrentGLTime(end_timestamp);
+    cpu_time_ref_->SetFakeCPUTime(expect_end_time);
+    gl_fake_queries_.SetDisjoint();
+
+    ExpectOutputterEndMocks(outputter_ref_.get(), category_name, trace_name,
+                            expect_start_time, expect_end_time, false);
+
+    ASSERT_TRUE(tracer.End(source));
+    ASSERT_TRUE(tracer.EndDecoding());
+
+    outputter_ref_ = NULL;
+    cpu_time_ref_ = NULL;
   }
+};
 
-  virtual GpuTracerType GetTracerType() = 0;
-
-  GlFakeQueries gl_fake_queries_;
+class InvalidTimerTracerTest : public BaseGpuTracerTest {
+ public:
+  InvalidTimerTracerTest()
+      : BaseGpuTracerTest(kTracerTypeInvalid) {
+  }
 };
 
 class GpuARBTimerTracerTest : public BaseGpuTracerTest {
- protected:
-  GpuTracerType GetTracerType() override { return kTracerTypeARBTimer; }
+ public:
+  GpuARBTimerTracerTest()
+      : BaseGpuTracerTest(kTracerTypeARBTimer) {
+  }
 };
 
 class GpuDisjointTimerTracerTest : public BaseGpuTracerTest {
- protected:
-  GpuTracerType GetTracerType() override { return kTracerTypeDisjointTimer; }
+ public:
+  GpuDisjointTimerTracerTest()
+      : BaseGpuTracerTest(kTracerTypeDisjointTimer) {
+  }
 };
 
-TEST_F(GpuARBTimerTracerTest, GPUTrace) {
-  // Test basic timer query functionality
-  {
-    DoTraceTest();
-  }
+TEST_F(InvalidTimerTracerTest, InvalidTimerBasicTracerTest) {
+  DoBasicTracerTest();
 }
 
-TEST_F(GpuDisjointTimerTracerTest, GPUTrace) {
-  // Test basic timer query functionality
-  {
-    DoTraceTest();
-  }
+TEST_F(GpuARBTimerTracerTest, ARBTimerBasicTracerTest) {
+  DoBasicTracerTest();
+}
+
+TEST_F(GpuDisjointTimerTracerTest, DisjointTimerBasicTracerTest) {
+  DoBasicTracerTest();
+}
+
+TEST_F(InvalidTimerTracerTest, InvalidTimerTracerMarkersTest) {
+  DoTracerMarkersTest();
+}
+
+TEST_F(GpuARBTimerTracerTest, ARBTimerBasicTracerMarkersTest) {
+  DoTracerMarkersTest();
+}
+
+TEST_F(GpuDisjointTimerTracerTest, DisjointTimerBasicTracerMarkersTest) {
+  DoTracerMarkersTest();
+}
+
+TEST_F(GpuDisjointTimerTracerTest, DisjointTimerDisjointTraceTest) {
+  DoDisjointTest();
+}
+
+// Test basic functionality of the GPUTracerTester.
+TEST(GPUTracerTester, IsTracingTest) {
+  MockGLES2Decoder decoder;
+  GPUTracerTester tracer_tester(kTracerTypeInvalid, &decoder);
+  EXPECT_FALSE(tracer_tester.IsTracing());
+  tracer_tester.SetTracingEnabled(true);
+  EXPECT_TRUE(tracer_tester.IsTracing());
+}
+
+TEST(GPUTracerTester, DecodeTest) {
+  MockGLES2Decoder decoder;
+  GPUTracerTester tracer_tester(kTracerTypeInvalid, &decoder);
+  ASSERT_TRUE(tracer_tester.BeginDecoding());
+  EXPECT_FALSE(tracer_tester.BeginDecoding());
+  ASSERT_TRUE(tracer_tester.EndDecoding());
+  EXPECT_FALSE(tracer_tester.EndDecoding());
+}
+
+TEST(GPUTracerTester, TraceDuringDecodeTest) {
+  MockGLES2Decoder decoder;
+  GPUTracerTester tracer_tester(kTracerTypeInvalid, &decoder);
+  const std::string category_name("trace_category");
+  const std::string trace_name("trace_test");
+
+  EXPECT_FALSE(tracer_tester.Begin(category_name, trace_name,
+                                   kTraceGroupMarker));
+
+  ASSERT_TRUE(tracer_tester.BeginDecoding());
+  EXPECT_TRUE(tracer_tester.Begin(category_name, trace_name,
+                                  kTraceGroupMarker));
+  ASSERT_TRUE(tracer_tester.EndDecoding());
 }
 
 }  // namespace gles2
diff --git a/gpu/command_buffer/service/in_process_command_buffer.cc b/gpu/command_buffer/service/in_process_command_buffer.cc
index d43f84c..c312345 100644
--- a/gpu/command_buffer/service/in_process_command_buffer.cc
+++ b/gpu/command_buffer/service/in_process_command_buffer.cc
@@ -33,7 +33,7 @@
 #include "gpu/command_buffer/service/query_manager.h"
 #include "gpu/command_buffer/service/transfer_buffer_manager.h"
 #include "gpu/command_buffer/service/valuebuffer_manager.h"
-#include "ui/gfx/size.h"
+#include "ui/gfx/geometry/size.h"
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_image.h"
 #include "ui/gl/gl_share_group.h"
diff --git a/gpu/command_buffer/service/stream_texture_manager_in_process_android.cc b/gpu/command_buffer/service/stream_texture_manager_in_process_android.cc
index 1026f45..621e6a1 100644
--- a/gpu/command_buffer/service/stream_texture_manager_in_process_android.cc
+++ b/gpu/command_buffer/service/stream_texture_manager_in_process_android.cc
@@ -7,7 +7,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "gpu/command_buffer/service/texture_manager.h"
-#include "ui/gfx/size.h"
+#include "ui/gfx/geometry/size.h"
 #include "ui/gl/android/surface_texture.h"
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_image.h"
diff --git a/gpu/command_buffer/tests/gl_manager.h b/gpu/command_buffer/tests/gl_manager.h
index 7a3eb2c..cad1469 100644
--- a/gpu/command_buffer/tests/gl_manager.h
+++ b/gpu/command_buffer/tests/gl_manager.h
@@ -10,8 +10,8 @@
 #include "base/memory/scoped_ptr.h"
 #include "gpu/command_buffer/client/gpu_control.h"
 #include "gpu/command_buffer/service/feature_info.h"
+#include "ui/gfx/geometry/size.h"
 #include "ui/gfx/gpu_memory_buffer.h"
-#include "ui/gfx/size.h"
 
 namespace base {
 class CommandLine;